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

Aar*_*ras 3 python module pip python-3.x

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

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

pip install emailage-official
Run Code Online (Sandbox Code Playgroud)

然后,只需导入:

from emailage.client import EmailageClient
Run Code Online (Sandbox Code Playgroud)

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

软件包位于:

C:\Users\aaron\AppData\Local\Programs\Python\Python37-32\Lib\site-packages\emailage
Run Code Online (Sandbox Code Playgroud)

此文件夹具有(似乎)带有__init__.py和的正确文件。但是,pylint和命令行解释器都向我抛出“没有名为“ emailage.client”的模块”。“电子邮件”不是包裹“错误。

我的输出sys.path是:

[... 
'C:\\Users\\aaron\\AppData\\Local\\Programs\\Python\\Python37-32\\lib\\site-packages'
...
]
Run Code Online (Sandbox Code Playgroud)

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

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

ref*_*llo 11

我遇到了类似的问题,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
Run Code Online (Sandbox Code Playgroud)

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

from myapi.myapi_creds import my_user, my_pass
Run Code Online (Sandbox Code Playgroud)

测试模块“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
Run Code Online (Sandbox Code Playgroud)

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


Aar*_*ras 7

问题出在我文件命名上

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

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

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

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

  • Python中的一个众所周知的问题。切勿将脚本命名为“ email.py”,“ test.py”等。 (2认同)

way*_*iki 5

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

    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
Run Code Online (Sandbox Code Playgroud)

我的项目结构如下(使用 PyCharm): 项目结构视图

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

from LocalSearch.LocalSearch import LocalSearch
Run Code Online (Sandbox Code Playgroud)

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

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