我已经阅读了大量的stackoverflow答案和一堆教程。另外,我试图阅读Python文档,但我无法使这个import
工作。
这是目录的样子:
myDirectory
├── __init__.py
├── LICENSE
├── project.py
├── README.md
├── stageManager.py
└── tests
├── __init__.py
└── test_project.py
在project.py
中有一个名为Project
的类,我想将它导入tests
目录下的文件中。我尝试过以下方法:
相对进口:
from ..project import Project
def print_sth():
print("something")
这给了我以下错误:(从tests
目录运行为python test_project.py
,从myDirectory
运行为python tests/test_project.py
)
Traceback (most recent call last):
File "test_project.py", line 1, in <module>
from ..project import Project
SystemError: Parent module '' not loaded, cannot perform relative import
使用包名称进行绝对导入:
如果我有类似下面的内容,我会得到ImportError(使用与上面相同的运行命令)。
from project import Project
def print_sth():
print("something")
------------------------------------------------------
Traceback (most recent call last):
File "test_project.py", line 1, in <module>
from project import Project
ImportError: No module named 'project'
这也是:
from myDirectory.project import Project
def print_sth():
print("something")
------------------------------------------------------
Traceback (most recent call last):
File "test_project.py", line 1, in <module>
from myDirectory.project import Project
ImportError: No module named 'myDirectory'
最后,我尝试在if __name__ == '__main__'
文件中添加test_project.py
语句,但它仍然失败了。如果有人能提供帮助我真的很感激。如果有一个解决方案,我不必写一个详细命令,我宁愿这样做。
当您通过filename运行Python脚本时,Python解释器假定它是顶级模块(并且它将脚本所在的目录添加到模块搜索路径中)。如果脚本在包中,那就不正确了。相反,您应该使用-m
标志运行模块,该标志采用与import语句(点分隔符)相同格式的模块名称,并将当前目录放在模块搜索路径中。
所以,你可以用myDirectory
运行测试:python -m tests.test_project
。当您以这种方式运行脚本时,您尝试的任何一种导入都将起作用。
但是如果myDirectory
本身应该是一个顶级包(正如__init__.py
文件所暗示的那样),你可能应该进一步上升到myDirectory
的父级,然后使用两个级别的包名运行脚本:python -m myDirectory.tests.test_project
。如果你这样做并希望测试使用绝对导入,你需要命名project
模块所在的顶级包:from myDirectory.project import Project
。