Python 3.5无法导入模块

西拉朱斯·塞勒金

我已经阅读了大量的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目录aspython test_project.py和从myDirectoryas运行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解释器会假定它是一个顶级模块(并将该脚本所在的目录添加到模块搜索路径中)。如果脚本在软件包中,那是不正确的。相反,您应该使用-m标志运行模块,该标志采用与导入语句相同的格式的模块名称(带点分隔符),并将当前目录放置在模块搜索路径中。

所以,你可以运行从测试myDirectory用:python -m tests.test_project当您以这种方式运行脚本时,尝试的两种导入都将起作用。

但是,如果myDirectory应该将其本身看作是顶级软件包(如__init__.py文件所示),则应该将其升级为myDirectory的父级,并使用两级软件包名称运行脚本:python -m myDirectory.tests.test_project如果您这样做并希望测试使用绝对导入,则需要将project模块所在的顶级包命名为:from myDirectory.project import Project

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档