在同一级别的另一个模块中导入Python模块

5

我正在开发一个Python软件包,其基本结构如下所示,其中大括号中包含了每个Python文件的示例内容。

MAIN_PACKAGE/
    setup.py
    main_package/
        __init__.py 
        { 
        import package1
        import package2
        __all__=['main_package']
        }
        package1/
            __init__.py
            {
            import module1
            import module2
            __all__=['package1']
            }
            module1/
                __init__.py
                {
                from script1 import Class1A, Class1B
                __all__ = ['script1']
                }
                script1.py
                {contains 2 classes: Class1A and Class1B}

            module2/
                __init__.py
                {
                from script2 import Class2A, Class2B
                __all__ = ['script2']
                }
                script2.py
                {contains 2 classes: Class2A, Class2B}

            module3/
                __init__.py
                {
                from script3 import Class3A, Class3B
                __all__ = ['script3'] 
                }
                script3.py
                {contains 2 classes: Class3A, Class3B}

        package2/
                executable_script.py

到目前为止,它没有给我带来麻烦。然而,我最近添加了一个新模块(module3),但无法正确导入。

我已经找到了一些相关的线索,但都不是这个特定问题。

我可以通过setup.py成功安装它,然后从命令行(任何目录)中正确导入以下内容:

python
>>> from main_package.package1.module3.script3 import Class3A, Class3B

但是,当我将同样的代码复制到脚本2中并重新运行setup.py文件(没有错误),当我运行executable_script时,会出现以下错误:

ImportError: cannot import name Class3A

然后,我在尝试通过命令行导入到Python时也遇到了相同的错误。但是,只有当我尝试将Class3A从script3导入到script2时才会出现此问题,而不是导入类似的类别从script1到script2。我唯一能看到的区别是script3比script1更新。是否存在某些未更新的内容,以便我可以将此新模块/类导入旧脚本中?或者结构有问题而绑定要追上我呢?
另一个细节是,仅当将该行添加到同一级别的另一个模块时,才会发生此错误,但错误起源于package2中的executable_script.py文件。例如,错误消息的第一行为:
/usr/bin/executable_script, line 9, in load_entry_point('MAIN_PACKAGE==0.1.0','console_scripts','executable_script')()
可执行脚本的第9行是文档字符串的一部分。我正在使用Python 2.7。

由于您在module3__init__中导入了它们,所以from main_package.package1.module3 import Class3A, Class3B应该可以正常工作,您不需要在末尾加上.script3 - chown
1个回答

1

可能你遇到了循环导入问题。在 ClassA 中导入了 ClassB,并且在 ClassB 中某个地方又导入了 ClassA,或者在更多的文件中,比如在 ClassA 中导入了 ClassB,在 ClassC 中导入了 ClassB 和 ClassA。

尝试使用绝对导入:

from .script3 import Class3A

我尝试过这个,但仍然出现错误。在每个脚本中,我在类外部导入模块。因此,在每个脚本的顶部导入模块,但在特定类中没有导入任何内容。 - user3403779
好的,你是对的。script3和script2试图相互导入。这对于这个包来说是一个简单的修复(script3不需要导入script2,但script2需要导入script3)。但我想知道这是否绝对不可能。在某些情况下,这似乎是可取的。 - user3403779
我曾经遇到过这种情况,认为需要这样做,但是没有办法。如果你无法通过只导入一个文件来解决你的需求,那么你就必须使用中间文件。 - Gocht

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接