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

我得到:
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-但这是语法错误。

另外,from . import module2中的module1可以正常工作,但是from . import module1中的module2不起作用...

更新:

这种技巧有效(但我正在寻找“官方”方式):
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,但是如果可重用,那么又为什么呢?

10-05 21:08