【问题标题】:Python can't find module in the same folderPython 在同一文件夹中找不到模块
【发布时间】:2014-09-03 12:34:49
【问题描述】:

我的 python 在同一目录中找不到任何模块。 我究竟做错了什么? (python2.7)

所以我有一个目录'2014_07_13_test',里面有两个文件:

  1. test.py
  2. hello.py

hello.py:

# !/usr/local/bin/python
# -*- coding: utf-8 -*-

def hello1():
    print 'HelloWorld!'

和 test.py:

# !/usr/local/bin/python
# -*- coding: utf-8 -*-

from hello import hello1

hello1()

仍然是 python 给了我

>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 4, in <module>
ImportError: No module named hello

怎么了?

【问题讨论】:

  • 你是如何执行脚本的?还有import sys; sys.path的输出是什么@
  • 试试&gt;&gt;&gt; import test
  • @Casy_fill 您是否从目录运行程序,文件在哪里?对于导入,导入和导入的文件共享一个目录并不重要。重要的是,您的 Python 解释器已正确设置当前目录。
  • 仔细检查您正在运行预期根目录中的文件。

标签: python module


【解决方案1】:

你的代码很好,我怀疑你的问题是你如何启动它。

您需要从“2014_07_13_test”目录启动 python。

打开命令提示符并“cd”到“2014_07_13_test”目录。

例如:

$ cd /path/to/2014_07_13_test
$ python test.py

如果你不能像这样'cd'进入目录,你可以将它添加到sys.path

在 test.py 中:

import sys, os
sys.path.append('/path/to/2014_07_13_test')

或设置/编辑PYTHONPATH

一切都会好起来的……

...好吧,您的“shebang”行(两个文件中的第一行)有一个小错误,“#”和“!”之间不应有空格

您应该使用better shebang

此外,您不需要在每个文件上都使用 shebang 行...只需要您打算从 shell 作为可执行文件运行的那些。

【讨论】:

  • 非常感谢,这个问题!不幸的是,SublimeRepl(我使用的)现在不支持从文件夹启动 python,所以我现在需要导出 PATH
  • 以后的读者请阅读到页面底部以查看其他非常有用的答案,例如jfn 关于relative imports的那个。
  • 是的,这是我的问题。我在 VS Code 中打开了一个包含 Python 练习项目的大文件夹,但在同一目录中查找内容时遇到了很大的问题。我的问题是,在终端中,我没有将目录更改为我当前项目所在的子目录。一旦我这样做了,问题就解决了。
  • 请注意 sys.path.append() 仅添加当前 python 会话的位置,而不是永久添加。
【解决方案2】:

将 test.py 中的导入更改为:

from .hello import hello1

【讨论】:

  • 如果其他人后来发现了这个,这称为相对导入,是在 python 2.5 中添加的:docs.python.org/2.5/whatsnew/pep-328.html
  • 导入整个模块使用from . import hello
  • 我认为这是一个比公认的最佳答案更好的解决方案。正如 ST7 指出的那样,我使用整个模块导入:from . import local_module
【解决方案3】:

我有一个类似的问题,我通过将文件的目录显式添加到路径列表来解决它:

import os
import sys

file_dir = os.path.dirname(__file__)
sys.path.append(file_dir)

之后,我从同一个目录导入就没有问题了。

【讨论】:

  • 虽然这行得通,但 jwn 使用相对导入的答案是一个更清洁的解决方案。
【解决方案4】:

这是我使用的通用解决方案。它解决了从同一文件夹中的模块导入的问题:

import os.path
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))

把它放在给出错误“No module named xxxx”的模块顶部

【讨论】:

  • 这帮助我从父目录加载模块,将“..”替换为“../..”。非常感谢!
  • file 要导入的文件的名称或我们正在导入模块的当前模块的名称,或者它是常量
【解决方案5】:

就我而言,Python 无法找到它,因为我将代码放在带有连字符的模块中,例如my-module。当我将其更改为 my_module 时,它起作用了。

【讨论】:

    【解决方案6】:

    我遇到了这个问题。我在同一个目录中有三个文件夹,所以我必须指定哪个文件夹。 例如:从文件夹导入脚本

    【讨论】:

      【解决方案7】:

      以下并没有解决OP的问题,但标题和错误正是我所面临的。

      如果您的项目中有一个setup.py 脚本,您可以安装您所在的包,使用python3 -m pip install -e .python3 setup.py installpython3 setup.py develop,该包将被安装,但仍可编辑(因此更改导入包时会看到代码)。如果它没有setup.pymake sense of it

      无论如何,OP面临的问题似乎已经不存在了?

      文件one.py:

      def function():
          print("output")
      

      文件two.py:

      #!/usr/bin/env python3
      
      import one
      one.function()
      
      chmod +x two.py # To allow execution of the python file
      ./two.py # Only works if you have a python shebang
      
      Command line output: output
      

      其他解决方案看起来很“脏”

      对于带有 2 个测试文件的 OP,修改它们以使其正常工作可能没问题。但是,在其他实际场景中,可能不推荐其他答案中列出的方法。它们要求您修改 python 代码或限制您的灵活性(从特定目录运行 python 文件)并且通常会引入烦恼。如果您刚刚克隆了一个项目,并且发生了这种情况怎么办?它可能已经对其他人有效,并且不需要更改代码。选择的答案还希望人们从特定文件夹运行脚本以使其工作。这可能是长期烦恼的根源,这绝不是好事。它还建议将您的特定 python 文件夹添加到 PATH(可以通过 python 或命令行完成)。同样,如果您在几个月内重命名或移动文件夹会发生什么?您必须再次搜索此页面,最终发现您需要设置路径(几个月前您确实这样做了),并且您只需要更新路径(确保您可以使用 sys.path 并以编程方式设置它,但这可能仍然不稳定)。许多令人烦恼的来源。

      【讨论】:

        【解决方案8】:

        如果您确定您尝试导入的所有模块、文件都在同一个文件夹中,并且应该直接通过提供名称而不是引用路径来选择它们,那么您的编辑器或终端应该已经打开了主目录所有文件/模块都存在的文件夹。

        或者,尝试从终端运行,确保首先进入正确的目录。

        cd path to the root folder where all the modules are

        python script.py

        或者,如果从编辑器(即 VsCode)运行 [F5],则在此处打开完整文件夹,而不是单个文件。

        【讨论】:

          【解决方案9】:

          我有一些类似的问题。即使它们都在同一个目录中,我也无法导入模块(importError)。我尝试了上面的解决方案,但没有一个对我有用。我必须自己(手动)设置路径。另外,代码是在我的大学服务器上运行的,也许这就是我必须手动设置路径的原因。

          import sys
          sys.path.append(r'path_to_directory_where_all_modules_are')
          

          我推荐阅读The Module Search Path

          【讨论】:

            猜你喜欢
            • 2021-04-26
            • 2021-12-24
            • 2012-06-07
            • 1970-01-01
            • 1970-01-01
            • 2015-04-25
            • 2021-04-20
            • 1970-01-01
            • 2021-08-27
            相关资源
            最近更新 更多