我的项目结构如下:
.
└── 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.py
和PACKAGE_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'
我在这里做什么错了?
答案 0 :(得分:1)
import
在sys.path
中列出的特定位置搜索您的包裹。有关详细信息,请参见doc。
当前目录始终附加到此列表中,这就是您成功运行PACKAGE_A
内部所有内容的原因。但是从project name
开始,无法知道在哪里找到PACKAGE_A
。
解决方案包括:
并且取决于您的项目和您的需求。
答案 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.py
和path\to\project name\
中没有path\to\project name\PACKAGE_A
(其中{{1 }}驻留)不在module_a.py
中。
关于您为何成功运行sys.path
中的所有内容的原因,是因为Python将包含正在运行的脚本的目录添加到列表中(如gaFF所述)。
我建议您多读一些有关python导入的信息,如果doc看起来过于混乱,则可以检查此link。
这是个人喜好,但是我发现将项目的根目录添加到PACKAGE_A
环境变量中,然后从该目录的级别运行所有脚本并相应地更改import语句,这更为简单。在您的示例中,根目录为PYTHONPATH
。