【问题标题】:Python cannot import module from subdirectory even with a file named __init.py__ in the directory即使目录中有名为 __init.py__ 的文件,Python 也无法从子目录导入模块
【发布时间】:2014-01-02 19:33:42
【问题描述】:

我知道这个问题已经在这里被问过很多次了,我可能已经阅读了大部分答案(包括thisthat)以及 python 文档,但仍然找不到我非常简单的答案进口问题。它是如此简单,以至于我必须错过一些愚蠢的东西,但我还没有看到它。 我已经设置了以下结构:

myproject
    myscript.py
    MyPackage
        __init.py__
        mymodule.py

我只想从myscript.py 加载mymodule.py(或应该相同的命令行python 解释器)。

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 放在项目目录中而不使用包,则导入工作正常。但我不明白为什么从子包导入不起作用。 知道如何让它发挥作用吗?

感谢您的帮助!

【问题讨论】:

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

标签: python import package


【解决方案1】:

在编辑帖子的格式时,我注意到您正在调用您的文件__init.py_。这会导致 python 无法将您的 MyPackage 目录识别为包,因此无法识别 ImportError: No module named MyPackage

应该改为 __init__.py(名称 __init__,扩展名 .py)。然后它将起作用,您的项目结构和导入语句在其他方面是正确的。

不过有一点:您还应该使用lower_underscore 样式来命名您的包。包在 Python 中也是模块,它们应该遵循相同的命名约定。有关推荐样式和命名约定的详细信息,请参阅PEP8。这只是一个约定,与你的问题无关。

【讨论】:

  • Python 区分大小写,因此即使在 Windows 下,包结构和导入也不匹配。
  • 当然是,并且它们在他的描述中完全匹配:他调用包MyPackage并将其导入为import MyPackage,将模块称为mymodule.py并将其导入或引用为from .. import mymodule .您完全不需要在模块和包之间同步外壳。
  • 哇,让我印象深刻的是,我花了三个或更多小时来解决这个问题,尽管一遍又一遍地阅读文档,但我完全忽略了您发现的 __init__.py 的错误命名。完美的!现在终于可以用了,谢谢你的回答!
猜你喜欢
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 2017-03-18
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
相关资源
最近更新 更多