我正在制作一个包,如果__name __ ==’__ main__’:测试用的块,则该包中的模块内部都有代码.但是我尝试在这些模块中使用相对导入会导致错误.
我已经阅读了此主题以及其他十亿主题:
Relative imports for the billionth time
在将其标记为重复项之前,如果我想做的事情在Python3中是不可能的,那么我的问题是为什么它在Python2中能工作,是什么促使在Python3中做出如此麻烦的决定?
这是我的示例Python项目:
mypackage
- module1.py
- module2.py
- __init__.py
__init__.py和module2.py为空
module1.py包含:
import module2
# module1 contents
if __name__=="__main__":
# Some test cases for the contents of this module
pass
在Python2中可以正常工作.我可以从计算机上其他任何地方的其他项目中导入module1,也可以直接运行module1并在if块中运行代码.
但是,此结构在Python3中不起作用.如果我尝试将模块导入其他地方,它将失败:
>>> from mypackage import module1
Traceback (most recent call last):
File "<stdin>",line 1,in <module>
File "C:\_MyFiles\Programming\Python Modules\mypackage\module1.py",in <module>
import module2
ModuleNotFoundError: No module named 'module2'
因此,我尝试将第一行更改为从.导入module2,并对其进行了修复,因此我可以成功地从任何地方导入模块.但是,当我尝试直接将module1作为脚本运行时,出现此错误:
Traceback (most recent call last):
File "C:/_MyFiles/Programming/Python Modules/mypackage/module1.py",in <module>
from . import module2
ImportError: cannot import name 'module2' from '__main__' (C:/_MyFiles/Programming/Python Projects/pgui/mypackage/module1.py)
我不想每次在模块上工作时都想打开控制台并键入python -m myfile并想直接将其作为脚本运行.
我希望能够像在Python2中那样使用相对导入,而无需将其父文件夹添加到PYTHONPATH即可处理模块
有没有更好的解决方法或解决这些问题的方法?
Note that relative imports are based on the name of the current module. Since the name of the main module is always “main“,modules intended for use as the main module of a Python application must always use absolute imports.
因此,只需将module1.py中的导入行更改为:
从mypackage导入模块2
其他所有内容保持不变.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。