Python“未命名模块”错误; “包裹”不是包裹

时间:2019-01-23 18:52:40

标签: python python-3.x module pip

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

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

pip install emailage-official

然后,只需导入:

from emailage.client import EmailageClient

通过pip可以正常安装-没有错误。我仔细检查了电子邮件包是否存在于正确的目录中,并且确实存在。

包装位于:

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

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

我的sys.path的输出是:

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

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

我通常很少使用Python,因此不胜感激。

3 个答案:

答案 0 :(得分:3)

问题出在我的文件命名中。

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

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

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

对于遇到类似问题的其他人-谨防命名冲突。有时候,最简单的事情会使您耗时最长。

答案 1 :(得分:2)

我研究了这个问题,即使它与我遇到的错误不完全相同,也可以帮助我解决它。我将说明我遇到的情况,因为我认为某些用户可能会觉得方便。 因此,我收到以下错误日志:

    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不喜欢那样。 但是,在模块内部具有与包同名的模块就可以了,我想这个类只会增加额外的混乱。

答案 2 :(得分:0)

我遇到了类似的问题,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,以使其名称与子包名称不冲突。