ModuleNotFound:没有名为“ module_name”的模块

时间:2019-06-05 14:12:51

标签: python

我的项目结构如下:

.
└── project name
     ├── project name
     │   ├── __init__.py
     │   ├── module.py
     │  
     ├── PACKAGE_A
     │   ├── __init__.py
     │   ├── PACKAGE_A.py
     │   ├── module_a.py
     │

PACKAGE_A.py

from module_a import Some_Class

a = Some_Class()

class Another_Class:
    # class code here

module.py

"""
Notes
-----
https://stackoverflow.com/questions/16780014/import-file-from-parent-directory
"""

# Standard library imports
import os, sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

# Local application imports
from PACKAGE_A.PACKAGE_A import Another_Class
from PACKAGE_A.module_a import some_function

虽然module_a.pyPACKAGE_A.py运行没有问题,但运行module.py却失败了:

Traceback (most recent call last):
  File "path\to\project name\project name\module.py", line 12, in <module>
    from PACKAGE_A.PACKAGE_A import Another_Class
  File "path\to\project name\PACKAGE_A\PACKAGE_A.py", line 1, in <module>
    from module_a import Some_Class
ModuleNotFoundError: No module named 'module_a'

我在这里做什么错了?

2 个答案:

答案 0 :(得分:1)

importsys.path中列出的特定位置搜索您的包裹。有关详细信息,请参见doc

当前目录始终附加到此列表中,这就是您成功运行PACKAGE_A内部所有内容的原因。但是从project name开始,无法知道在哪里找到PACKAGE_A

解决方案包括:

  • 使用相对导入
  • 始终从根目录运行(并从根目录开始所有导入)
  • 将根目录添加到环境变量PYTHONPATH中(相同)
  • 使用一个在进入虚拟环境(相同)时设置PYTHONPATH的工具
  • ...

并且取决于您的项目和您的需求。

答案 1 :(得分:1)

您需要从以下位置更改PACKAGE_A.py中的导入语句:

from module_a import Some_Class

收件人:

from PACKAGE_A.module_a import Some_Class

原因是您要将path\to\project name\添加到sys.path,但是module_a.pypath\to\project name\中没有path\to\project name\PACKAGE_A(其中{{1 }}驻留)不在module_a.py中。

关于您为何成功运行sys.path中的所有内容的原因,是因为Python将包含正在运行的脚本的目录添加到列表中(如gaFF所述)。

我建议您多读一些有关python导入的信息,如果doc看起来过于混乱,则可以检查此link

这是个人喜好,但是我发现将项目的根目录添加到PACKAGE_A环境变量中,然后从该目录的级别运行所有脚本并相应地更改import语句,这更为简单。在您的示例中,根目录为PYTHONPATH