Python 3 中的相对导入问题

2024-02-25

Python 导入让我发疯(我对 python 导入的经验有时根本不符合成语“显式优于隐式”:( ):

[app]
    start.py
        from package1 import module1
    [package1]
        __init__.py
            print('Init package1')
        module1.py
            print('Init package1.module1')
            from . import module2
        module2.py
            print('Init package1.module2')
            import sys, pprint
            pprint.pprint(sys.modules)
            from . import module1

I get:

vic@ubuntu:~/Desktop/app2$ python3 start.py 
Init package1
Init package1.module1
Init package1.module2
{'__main__': <module '__main__' from 'start.py'>,
 ...
 'package1': <module 'package1' from '/home/vic/Desktop/app2/package1/__init__.py'>,
 'package1.module1': <module 'package1.module1' from '/home/vic/Desktop/app2/package1/module1.py'>,
 'package1.module2': <module 'package1.module2' from '/home/vic/Desktop/app2/package1/module2.py'>,
 ...
Traceback (most recent call last):
  File "start.py", line 3, in <module>
    from package1 import module1
  File "/home/vic/Desktop/app2/package1/module1.py", line 3, in <module>
    from . import module2
  File "/home/vic/Desktop/app2/package1/module2.py", line 5, in <module>
    from . import module1
ImportError: cannot import name module1
vic@ubuntu:~/Desktop/app2$ 

import package1.module1有效,但我想用from . import module1因为我想做package1对于我的其他应用程序来说是可移植的,这就是我想使用相对路径的原因。

我正在使用Python 3。

我需要循环导入。 module1 中的函数断言其参数之一是 module2 中定义的类的实例,反之亦然。

换句话说:

sys.modules包含'package1.module1': <module 'package1.module1' from '/home/vic/Desktop/app2/package1/module1.py'>。我想以表格形式获得对它的引用from . import module1,但它尝试获取一个名称,而不是像以防万一那样的包import package1.module1(效果很好)。我试过import .module1 as m1- 但这是一个语法错误。

Also, from . import module2 in module1工作正常,但是from . import module1 in module2不起作用...

UPDATE:

这个黑客有效(但我正在寻找“官方”方式):

print('Init package1.module2')

import sys, pprint
pprint.pprint(sys.modules)

#from . import module1
parent_module_name = __name__.rpartition('.')[0]
module1 = sys.modules[parent_module_name + '.module1']

解决您的问题的一个更好的解决方案是将 package1 放在它自己的单独包中。当然,它不能导入 package2,但话又说回来,如果它是可重用的,为什么会这样呢?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 3 中的相对导入问题 的相关文章

随机推荐