给定以下包:

testpackage
    __init__.py
    testmod.py
    testmod2.py


__init__.py的内容

from . import testmod
from . import testmod2


testmod.py的内容

# relative import without conditional logic, breaks when run directly
from . import testmod2
...
if __name__ == '__main__':
    # do my module testing here
    # this code will never execute since the relative import
    # always throws an error when run directly


testmod2.py的内容

if __name__ == 'testpackage.testmod2':
    from . import testmod
else:
    import testmod
...
if __name__ == '__main__':
    # test code here, will execute when the file is run directly
    # due to conditional imports


这不好吗?有没有更好的办法?

最佳答案

无疑,这将成为将来维护的麻烦。不仅仅是条件导入...更多是您必须进行条件导入的原因,即运行testpackage/testmod2.py作为主脚本会导致sys.path的第一项为./testpackage而不是. ,这使得testpackage作为软件包的存在消失了。

相反,我建议通过python -m testpackage.testmod2运行testmod2,并从testpackage外部进行操作。 testpackage.testmod2仍将显示为__main__,但条件导入将始终有效,因为testpackage将始终是程序包。

-m的缺点是它需要Python 2.5 or newer

关于python - Python中的条件相对导入…做还是不做?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7184663/

10-11 03:29