Python 3.5无法导入模块

问题描述 投票:1回答:1

我已经阅读了大量的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语句,但它仍然失败了。如果有人能提供帮助我真的很感激。如果有一个解决方案,我不必写一个详细命令,我宁愿这样做。

python python-3.x python-import
1个回答
1
投票

当您通过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

© www.soinside.com 2019 - 2024. All rights reserved.