Python无法从子目录导入模块,即使在该目录中有一个名为__init.py__的文件。

12

我知道这个问题在这里已经被问了很多次,而且我可能已经阅读了大部分答案(包括这个那个),还有Python文档,但是我仍然找不到解决我非常简单的导入问题的答案。这么简单以至于我一定错过了某些愚蠢的东西,但我还没有看到它。

我已经设置了以下结构:

myproject
    myscript.py
    MyPackage
        __init.py__
        mymodule.py

我只想从myscript.py(或命令行Python解释器,它应该是相同的)加载mymodule.p

myscript.py包含:

#!/usr/bin/python
import MyPackage

__init.py__ 包含:

from . import mymodule

mymodule.py 包含

#!/usr/bin/python

def myfunction():
    print "mymessage"

我的目标是从 myscript.py 中调用 myfunction,但如果我尝试调用该模块,则会收到以下错误信息:

$python myscript.py 
Traceback (most recent call last):
   File "myscript.py", line 2, in <module>
   import MyPackage
ImportError: No module named MyPackage

我已经尝试过的:

  • 我在OSX和Ubuntu Linux下尝试了所有可能减少Python安装错误可能性的方法。
  • 我将PYTHONPATH环境变量设置为myproject目录以及.和两者都设置。
  • 我留空了__init.py__
  • 我还尝试从myproject目录启动的Python解释器中导入语句。
  • 我尝试了以下导入语句:

    from MyPackage import mymodule
    import MyPackage.mymodule
    import MyPackage.mymodule as module
    
    • 所有尝试都失败了(相同的错误信息)。

    如果我将mymodule.py放在项目目录中而不使用包,导入可以正常工作。但我不明白为什么从子包中导入不起作用。 有没有办法让它工作呢?

    感谢帮助!


在导入MyPackage之前,您需要验证myproject目录是否列在sys.path中。sys.path是否包含正确的目录? - Martijn Pieters
如果我启动解释器并执行 import sysprint sys.path,它会显示一个包含“myproject”目录路径的列表:['', '/Users/michael/Entwicklung/python/myproject', ... ] - mhelwig
好的,那么这个包应该是可导入的。可能在包内部会有一个不同的导入错误。你说你已经尝试过一个空的__init__.py文件了。你能再试一次吗,但请确保删除所有的*.pyc文件。也许在__init__.py中添加一行单独的print "imported"语句。 - Martijn Pieters
1个回答

8
在编辑帖子格式时,我注意到你将文件名命名为__ init.py_。这会导致Python无法将你的MyPackage目录识别为包,因此出现了ImportError: No module named MyPackage
应该改为__init__.py(名称__init__,扩展名.py)。然后它就能正常工作了,你的项目结构和导入语句都是正确的。
不过有一个小问题:你应该使用lower_underscore样式来命名你的包。在Python中,包也是模块,因此它们应该遵循相同的命名约定和风格。有关推荐风格和命名约定的详细信息,请参见PEP8。这只是一种惯例,与你的问题无关。

Python是大小写敏感的,因此即使在Windows下,包结构和导入也不会匹配。 - Steve Barnes
当然是这样的,而且它们在他的描述中完美匹配:他将包称为MyPackage并将其导入为import MyPackage,模块mymodule.py则被导入或引用为from .. import mymodule。你在模块和包之间同步大小写是完全不必要的。 - Lukas Graf
1
哇,我真的很印象深刻,我花了三个或更多小时苦苦挣扎这个问题,尽管一遍又一遍地阅读文档,但我完全忽略了你指出的__init__.py的错误命名。太好了!现在它终于可以工作了,所以感谢你的答案! - mhelwig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接