繁体   English   中英

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

[英]Python 'No module named' error; 'package' is not a package

我正在尝试进行简单的导入并使用 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 安装了 numpy 只是为了测试它是否正常工作。 Numpy 安装到与 emailage 相同的 site-packages 文件夹中,并且在导入时工作正常,所以我被卡住了。

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

问题在于我的文件命名

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

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

重命名我的文件后一切正常。

对于遇到类似问题的其他人 -小心命名冲突 有时,最简单的事情会让你绊倒时间最长。

我遇到了类似的问题,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这样它的名称就不会与子包名称冲突。

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

    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):项目结构视图

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

from LocalSearch.LocalSearch import LocalSearch

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM