Python导入失败。相对导入、包识别、_init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu__

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为空 我的过程:

我已经读了很多关于这个问题的文章,政治公众人物的文章,大约有4篇,但是没有一篇文章对一些问题给出明确的观点,我仍然不能做相关的导入

事实上,我的主程序包的内容根本没有列出

重新调整。我修改了所有帖子,内容太复杂,问题太多。

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
    可能很重要