ImportError: No module named - Python
我有一个具有以下目录结构的python应用程序:
1 2 3 4 5 6 7 8 9
| src
|
+---- main
|
+---- util
|
+---- gen_py
|
+---- lib |
在package main中,我有一个名为myserver.py的python模块,它有一个import语句,如下所示:
1
| from gen_py.lib import MyService |
号
为了使该语句正常工作,我在myserver.py的开头放了以下行:
1 2
| import sys
sys.path.append('../gen_py/lib') |
当我在终端中运行myserver.py时,我得到以下错误:
ImportError: No module named gen_py.lib
号
我这里缺少什么?
- 您用来运行myserver.py的命令行是什么?你在哪个目录?
您对sys.path的修改假定当前工作目录始终位于main/中。事实并非如此。相反,只需将父目录添加到sys.path:
1 2 3 4 5
| import sys
import os.path
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
import gen_py.lib |
不要忘记在gen-py和lib中包含一个文件__init__.py——否则,它们将不会被识别为python模块。
- 这有帮助,谢谢。
- 我也有同样的问题。我使用windows,eclipse。在Eclipse中我们应该做什么?
- @CEREN这个代码应该在每个IDE中都有效。您的IDE(或者更准确地说,它的python插件)可能不会实际执行python代码,在这种情况下,您可能需要在某个地方配置搜索路径。请随便问一个新问题。
- @菲哈格,谢谢!我大约一小时前问过一个问题,请随意回答=)stackoverflow.com/questions/17038416/…
- 有没有可能把这个放在我的主应用程序以外的地方?我使用这个解决方案来解决我的类似错误,但现在我有一个文件,看起来到处都是导入。我以为在in i t文件中有一种方法可以做到这一点,但是我找不到好的例子。
- sys.path.append(os.path.join(os.path.dirname(__file__), '..'))的决心是什么?为什么不是sys.path.append(os.path.join('..', os.path.dirname(__file__)))呢?
- @alex __file__是文件的位置。典型值可以是myapp/foo/file.py、file.py或/usr/local/share/myapp/foo/file.py。os.path.dirname(__file__)从每个文件中删除文件名。附加..可以让我们进入父目录。你提出的代码完全是疯狂的。例如,从/home/user/运行/usr/local/share/myapp/foo/file.py时,正确的位置是/usr/local/share/myapp/。但是如果这是绝对路径,那么os.path.join会返回第二个参数,所以你得到的是/usr/local/share/myapp/foo/。
- @哦,好吧,我以为os.path.join(os.path.dirname(__file__), '..')会决定(例如)file.py/..。我觉得这有点疯狂。
要使python模块导入工作,路径中必须有"src",而不是"gen-py/lib"。
在处理像import gen_py.lib这样的导入时,它查找一个模块gen_py,然后查找一个子模块lib。
由于模块gen_py将不在"..gen-py/lib"中(它将在".."),因此添加的路径对导入过程没有任何帮助。
根据运行路径的不同,尝试将相对路径添加到"src"文件夹。可能是sys.path.append('..')。当您直接在src文件夹中,通过类似python main/MyServer.py的相对路径,也可以成功地运行脚本。
- 我尝试了这个sys.path.append("../../src/gen-py/lib"),但得到了相同的错误…
- 我不是这么说的。如果要导入"gen-py.lib",则不会将gen-py/lib附加到路径中。您附加了gen摼py在里面的文件夹,在本例中可能是"…"。
1
| from ..gen_py.lib import MyService |
或
1
| from main.gen_py.lib import MyService |
号
确保每个目录上都有一个(至少为空)__init__.py文件。
这是如果您正在构建一个包,并且在导入中发现错误。我很难理解这一点。答案不是将包添加到python路径中,或者通过编程来完成(如果您的模块被安装了,而您的命令又添加了它,会怎么样?)那是个坏办法。
正确的做法是:1)使用virtualenv pyvenv-3.4或类似的工具2)激活开发模式-$python setup.py develop
确保包含__init__.py,这使python知道这些目录包含包
确保在sys.path输出中是否出现根项目目录。否则,请将根项目目录的路径添加到sys.path。