循环进口实际上似乎是一个问题。
您的moduleB说“ from moduleA import bar”,它试图加载moduleA,但是它在moduleA中遇到的第一件事是“ from
moduleB import foo”,它将其发送回moduleB。因此,那里有一个无法解决的循环递归。
通常(但并非总是如此),循环导入是您需要重新考虑或重新设计操作方式的一种指标。但是,这里有一些可能的解决方法。
一种是将import语句移到python文件的底部(假设您在另一个函数内部使用foo或bar,因此在加载文件时不会立即调用它)
例如
#ModuleB.py class Bar(object): def __init__(self): self.foo = Foo() self.val = 10 . .# at bottom of filefrom moduleA import Foo
另一种选择是将import语句放在一个函数内,该函数称为“惰性导入”模式:
#ModuleB.py class Bar(object): def __init__(self): from moduleA import Foo self.foo = Foo() self.val = 10
关于您的
__init__.py文件问题。我认为没有理由不让他们为空。空
__init__.py文件只是告诉python“此目录是python包”,并允许导入。
通常,您的软件包目录中会有一个文件,该文件通过导入和利用子软件包中的模块来“运行”程序。因此,假设存在此类文件(例如package /
main.py),则您的导入将类似于以下内容,只是空
__init__.py文件。
#package/main.pyfrom subpackage1.moduleA import bar # you can now call bar() directlyfrom subpackage1 import moduleB # you can now call foo like: moduleB.foo()from subpackage2.moduleX import jah
您在上面所做的基本上是获取每个子包中所有模块的所有功能和属性,并使它们直接在子包中可用,就好像它们是子包的功能和属性一样(因此您可以
importsubpackage1调用
subpackage1.bar()和
subpackage.foo()
而不是
subpackage.moduleA.bar()等) ),但我没有得到您必须尝试做的印象,在这种情况下,可能没有理由这样做。
如果需要在subpackage1的模块中的subpackage2中使用某些东西,请参见此问题的答案。 或谷歌如何添加目录到您的Python路径。



