Python导入失败。相对导入、包识别、_init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu__
我已经读了很多关于这个问题的文章,政治公众人物的文章,大约有4篇,但是没有一篇文章对一些问题给出明确的观点,我仍然不能做相关的导入 事实上,我的主程序包的内容根本没有列出 重新调整。我修改了所有帖子,内容太复杂,问题太多。 在Python导入失败。相对导入、包识别、_init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu__,python,import,python-2.x,Python,Import,Python 2.x,我已经读了很多关于这个问题的文章,政治公众人物的文章,大约有4篇,但是没有一篇文章对一些问题给出明确的观点,我仍然不能做相关的导入 事实上,我的主程序包的内容根本没有列出 重新调整。我修改了所有帖子,内容太复杂,问题太多。 在C:/test/中,我有这个软件包: Package/ (FOLDER 2) __init__.py moduleA.py moduleB.py moduleA导入moduleB,反之亦然 \uuuu init\uuuu.py为空 我的过程:
C:/test/
中,我有这个软件包:
Package/ (FOLDER 2)
__init__.py
moduleA.py
moduleB.py
导入moduleA
,反之亦然moduleB
为空\uuuu init\uuuu.py
C:/test/
添加到sys.path
导入包
(工作)dir(包)
未列出包内的任何模块。
\uuuuu file\uuuu
是包下的初始文件\uuuu name\uuuu
是包
\uuuuuuuuuuu
是一个空字符串\uuuu路径
是C:/test/Package
测试1-版本1: 在
moduleA
中,我有来自包导入模块b
我明白了:
>>> import Package.moduleA
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:/test\Package\moduleA.py", line
from Package import moduleB
File "C:/test\Package\moduleB.py", line
from Package import moduleA
ImportError: cannot import name moduleA
现在,Package.moduleB
将Package
作为变量
令人惊讶的是,Package
看起来像一个合适的包,并且包含两个模块
事实上,在第1版和第2版中进行任何导入现在都可以,因为现在moduleA
和moduleB
是包的一部分
问题:
1) 为什么Package
不被识别为包?它是?它不应该包含所有子模块吗
2) 为什么运行import Package.moduleA
会在moduleA
内部生成Package
3) 为什么运行import-Package.moduleA
会将moduleA
添加到Package
中,而以前没有
4) 一个空的\uuuuu init\uuuuuuuuy.py
文件和一个非空的\uuuuuuu init\uuuuuuy.py
文件是否会对此产生影响
5) 定义一个包含['moduleA','moduleB']
的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
6) 如何使init文件加载这两个子模块?我应该在内部导入包.moduleA和包.moduleB吗?。。。我不能像import.moduleA那样做吗?(如果包的名称更改怎么办?)
7) 包变量上的空字符串是否影响?我们应该改变它的内容,如果我们想让它认识到自己<代码>\\\\\\/code>应该与\\\\\\\\
相同,否则PEP就是这么说的。但这样做不起作用:
if __name__ == "__main__" and __package__ is None:
__package__ = "Package"
这是一个循环依赖性问题。它与此非常相似,但不同之处在于您尝试从包导入模块,而不是从模块导入类。在这种情况下,最好的解决方案是重新考虑代码,这样就不需要循环依赖关系。将任何通用函数或类移出到包中的第三个模块
担心\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
是一种转移注意力的方法。当您的包成为一个合适的包时,python导入系统将适当地设置此选项
问题是,moduleA
和moduleB
只有在成功导入后才放在包中。但是,由于moduleA
和moduleB
都处于导入过程中,因此它们在包中无法看到对方。当您绕过相对导入机制时,绝对导入部分解决了问题。但是,如果您的模块在初始化过程中需要彼此的一部分,则程序将失败
如果删除了var=…
行,则以下代码将起作用
包.模块a
import package.moduleB
def func():
return 1
from . import moduleB
def depends_on_y():
return moduleB.y()
def x():
return "x"
from .common import y
def depends_on_y():
return y()
包.moduleB
import package.moduleA
var = package.moduleA.func() # error, can't find moduleA
from . import moduleA
def depends_on_x():
return moduleA.x()
def y():
return "y"
from .common import x
def depends_on_x():
return x()
包装破损的例子
包.模块a
import package.moduleB
def func():
return 1
from . import moduleB
def depends_on_y():
return moduleB.y()
def x():
return "x"
from .common import y
def depends_on_y():
return y()
包.moduleB
import package.moduleA
var = package.moduleA.func() # error, can't find moduleA
from . import moduleA
def depends_on_x():
return moduleA.x()
def y():
return "y"
from .common import x
def depends_on_x():
return x()
将通用部件提取到包中单独模块的示例
通用软件包
def x():
return "x"
def y():
return "y"
包.模块a
import package.moduleB
def func():
return 1
from . import moduleB
def depends_on_y():
return moduleB.y()
def x():
return "x"
from .common import y
def depends_on_y():
return y()
包.moduleB
import package.moduleA
var = package.moduleA.func() # error, can't find moduleA
from . import moduleA
def depends_on_x():
return moduleA.x()
def y():
return "y"
from .common import x
def depends_on_x():
return x()
这是3.5之前的Python版本中存在的Python错误。看看在哪里讨论过(很多年)以及该问题的常见案例在哪里得到了解决
在Python3.5中的修复之后,一个显式的相对导入,如from。如果moduleA
在package
中尚未出现,则从包内的模块导入模块a
将签入sys.modules
以查看package.moduleA
,然后放弃。由于模块对象在开始加载之前添加到sys.modules
,但在加载完成之前不会添加到包中
使用包导入*
中的进行循环导入仍然可能存在问题,但在(我为其提供了补丁)中,决定修复更模糊的角落案例不值得额外的代码复杂性
圆形进口通常是糟糕设计的标志。您可能应该将相互依赖的代码位重构为一个实用程序模块,由其他两个模块导入,或者将两个单独的模块合并为一个模块。import moduleB#moduleA内部不起作用
——您得到的堆栈跟踪是什么?您将遇到问题,因为您暗示test2
中的Package
是一个包(因为它有一个\uuuuu init\uuuuuu
),但您正在给路径添加C:/test2/Package
,而不是C:/test2
(这意味着它不能是一个包)。您的模块是否位于名为moduleA
和moduleB
的两个文件夹中。这一点很重要,因为test/Package/script.moduleA
可能很重要