Fro*_*oyo 4 python hierarchy importerror
我有这样的包裹
package/
__init__.py
subpackage1/
__init__.py
moduleA.py
moduleB.py
moduleC.py
moduleD.py
subpackage2/
__init__.py
moduleX.py
moduleY.py
moduleZ.py
Run Code Online (Sandbox Code Playgroud)
在moduleB.py中,我正在导入
from moduleA import bar
Run Code Online (Sandbox Code Playgroud)
在moduleA中,我正在导入
from moduleB import foo
Run Code Online (Sandbox Code Playgroud)
我收到了ImportError.
ImportError: cannot import name foo
Run Code Online (Sandbox Code Playgroud)
这可能是什么问题?为了避免这个问题,我该怎么办?我应该在_ init _ .py pf包,subpackage1,subpackage2中写什么?
_ INIT _ subpackage1的的.py
from moduleA import *
from moduleB import *
from moudleC import *
from moudleD import *
Run Code Online (Sandbox Code Playgroud)
subpackage2的_ init _ .py
from moduleX import *
from moduleY import *
from moduleZ import *
Run Code Online (Sandbox Code Playgroud)
_ init _ .py包
from subpackage1 import *
from subpackage2 import *
Run Code Online (Sandbox Code Playgroud)
我的_ init _ .py文件有问题吗?
编辑:我改变了进口
moduleB
from .moduleA import bar
Run Code Online (Sandbox Code Playgroud)
moduleA
from .moduleB import foo
Run Code Online (Sandbox Code Playgroud)
不过,我得到了相同的导入错误.
ImportError: cannot import name foo
Run Code Online (Sandbox Code Playgroud)
编辑:
moduleB
def Bar():
def __init__(self):
self.foo = Foo()
self.val = 10
.
.
Run Code Online (Sandbox Code Playgroud)
moduleA
def Foo():
def __init__(self):
self.bar = Bar()
self.val = 5
.
.
Run Code Online (Sandbox Code Playgroud)
我想做这个.我坚持要将这两个类保存在不同的文件中.我该怎么导入?
它实际上似乎是循环导入的问题.
你的moduleB说"来自moduleA导入栏",它试图加载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 file
from moduleA import Foo
Run Code Online (Sandbox Code Playgroud)
另一种方法是将import语句放在一个函数中,称为"惰性导入"模式:
#ModuleB.py
class Bar(object):
def __init__(self):
from moduleA import Foo
self.foo = Foo()
self.val = 10
Run Code Online (Sandbox Code Playgroud)
至于你关于__init__.py文件的问题.我看不出你为什么不把它们留空.空__init__.py文件只是告诉python"这个目录是一个python包"并允许导入.
通常,您的程序包目录中会有一个文件,它通过导入和利用子包中的模块来"运行"您的程序.因此,假设存在这样的文件(例如,package/main.py),您的导入将如下所示,只有空__init__.py文件.
#package/main.py
from subpackage1.moduleA import bar # you can now call bar() directly
from subpackage1 import moduleB # you can now call foo like: moduleB.foo()
from subpackage2.moduleX import jah
Run Code Online (Sandbox Code Playgroud)
你上面所做的基本上是获取每个子包中所有模块的所有功能和属性,并使它们直接在子包上可用,就像它们是子包的功能和属性一样(所以你可以import subpackage1调用subpackage1.bar()而subpackage.foo() 不是subpackage.moduleA.bar()等等) .),但我没有得到你想要做的事情的印象,必然,在这种情况下可能没有理由这样做.
如果您需要在subpackage1的模块中使用subpackage2中的内容,请参阅此问题的答案. 或谷歌如何将目录添加到您的python路径.
| 归档时间: |
|
| 查看次数: |
3928 次 |
| 最近记录: |