如何在带有if __name __ =’__ main__’块的Python3中使用相对导入?

前端之家收集整理的这篇文章主要介绍了如何在带有if __name __ =’__ main__’块的Python3中使用相对导入? 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在制作一个包,如果__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即可处理模块

有没有更好的解决方法解决这些问题的方法

最佳答案
根据Module documentation,对于__main__模块,您必须使用绝对导入.

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

其他所有内容保持不变.

原文链接:https://www.f2er.com/python/533097.html

猜你在找的Python相关文章