Python 'No module named' 错误; “包”不是包

Posted

技术标签:

【中文标题】Python \'No module named\' 错误; “包”不是包【英文标题】:Python 'No module named' error; 'package' is not a packagePython 'No module named' 错误; “包”不是包 【发布时间】:2019-06-17 10:25:19 【问题描述】:

我正在尝试进行简单的导入并使用 emailage 第三方库。

根据他们的文档,使用他们的库的方式如下:

pip install emailage-official

然后,只需导入:

from emailage.client import EmailageClient

使用 pip 可以正常安装 - 没有错误。我仔细检查了 emailage 包是否存在于正确的目录中,并且确实存在。

包存在于:

C:\Users\aaron\AppData\Local\Programs\Python\Python37-32\Lib\site-packages\emailage

此文件夹(似乎)包含带有__init__.py 和所有内容的正确文件。但是,pylint 和命令行解释器都给我一个 '没有名为'emailage.client'的模块; 'emailage' 不是一个包' 错误。

我的sys.path 的输出是:

[... 
'C:\\Users\\aaron\\AppData\\Local\\Programs\\Python\\Python37-32\\lib\\site-packages'
...
]

所以安装 emailage 的目录是路径的一部分......最后我 pip-installed numpy 只是为了测试它是否正常工作。 Numpy 安装在与 emailage 相同的 site-packages 文件夹中,并且在导入时工作正常,所以我被卡住了。

我通常不经常使用 Python,因此我们将不胜感激。

【问题讨论】:

【参考方案1】:

问题在于我的文件命名

我匆忙将我的文件命名为emailage.py,然后尝试从emailage.client 导入。

我假设 Python 在检查已安装的第三方库之前查看了我的当前目录并匹配了我正在处理的文件的名称。

重命名文件后一切正常。

对于遇到类似问题的其他人 -- 注意命名冲突。有时,最简单的事情会让你失望最长。

【讨论】:

Python 中一个众所周知的问题。切勿将您的脚本命名为 email.pytest.py 等。 同意 - 我的 Python 缺乏经验/生锈肯定会出现在这里。完全忘记了这种类型的问题出现在 Python 中。 谢谢 - 我遇到了这个问题......作为一个 Python 菜鸟并没有意识到它不够聪明,无法区分不同路径中的名称。有道理,但在文档中并不清楚。 谢谢。非常愚蠢,但了解它很重要。【参考方案2】:

我遇到了类似的事情,OP 关于命名空间冲突的答案最终让我明白了。

我对其中的子包(目录)和模块(文件)使用了相同的名称。

例如我有这个:

/opt/mylib/myapi
/opt/mylib/myapi/__init__.py
/opt/mylib/myapi/myapi_creds.py        # gitignored file for user/pass
/opt/mylib/myapi/myapi.py              # base module, load creds and connect
/opt/mylib/myapi/myapi_dostuff.py      # call myapi.py and do work

脚本“myapi.py”通过以下语句从 myapi_creds.py 导入凭据:

from myapi.myapi_creds import my_user, my_pass

测试模块“myapi.py”导致了这个错误:

$ ./myapi.py
Traceback (most recent call last):
  File "./myapi.py", line 12, in <module>
    from myapi.myapi_creds import my_user, my_pass
  File "/opt/mylib/myapi/myapi.py", line 12, in <module>
    from myapi.myapi_creds import my_user, my_pass
ModuleNotFoundError: No module named 'myapi.myapi_creds'; 'myapi' is not a package

解决方案是将myapi.py 重命名为myapi_base.py,使其名称不会与子包名称冲突。

【讨论】:

这正是我过去几周一直在努力解决的问题。命名事物的一个非常奇怪和意想不到的限制。并且无法从错误消息中猜测问题。感谢您指出这个 Python 怪癖!【参考方案3】:

我看了一下这个问题,尽管它与我遇到的错误不完全相同,但它帮助我解决了它。我将解释我的情况,因为我认为一些用户可能会觉得这很方便。 所以,我收到以下错误日志:

    Traceback (most recent call last):
  File "/home/kemal/Programming/Python/Preference_Articulation/LocalSearch/LS_apriori.py", line 1, in <module>
    from LocalSearch.LocalSearch import LocalSearch
ModuleNotFoundError: No module named 'LocalSearch.LocalSearch'; 'LocalSearch' is not a package

我的项目结构如下(使用 PyCharm): View of project structure

需要注意的重要一点是,我将代码分成了几个文件夹,因为它使代码更具可读性。现在,在名为 LocalSearch 的文件夹中,我有 4 个文件,LocalSearch、LS_apriori 和一些 2 个测试文件(不相关)。当尝试运行文件 LS_apriori (它使用文件 LocalSearch 中的方法和类)时,我收到了上面提供的错误。具体代码并不重要,我处理导入的方式如下:

from LocalSearch.LocalSearch import LocalSearch

修复很简单。我将 py 文件 LocalSearch 重命名为 Local_Search(只是添加了一个下划线)。之后,错误就消失了。

所以我的问题是拥有一个与其中的文件(模块)同名的文件夹(包),其中有一个同名的类。 Python 不喜欢这样。 拥有与其中的包同名的模块是可以的,但我猜这个类只是增加了额外的混乱。

【讨论】:

以上是关于Python 'No module named' 错误; “包”不是包的主要内容,如果未能解决你的问题,请参考以下文章

python 错误 no module named _future_

Python报错No module named 'cv2'

python 错误 no module named Crypto.Cipher

python 3.x报错:No module named 'cookielib'或No module named 'urllib2'

python 运行报错 no module named configparser

No module named wsgi 求助