首页 > 解决方案 > 如何在 Python 中使用相互引用的模块编写包?

问题描述

我正在尝试制作一个包含相互导入的模块的包,但我对它的工作原理感到非常困惑。我制作了三个文件:test1.py,它们包含在我的包目录test2.py中。文件内容如下:__init__.pytestpack

# test1.py

def demo():
    print("123")
    return 

# test2.py
import test1

def demo2():
    print("test 2")
    test1.demo()

if __name__=="__main__":
    demo2()

__init__.py文件为空。当我test2.py自己运行时,我得到了预期的输出:

    test 2
    123

main.py的父目录中也有一个文件testpack

# main.py 

import testpack.test1
import testpack.test2

testpack.test2.demo2()

运行它会给出错误:

    Traceback (most recent call last):
      File "E:/packages/main.py", line 2, in <module>
        import testpack.test2
      File "E:\packages\testpack\test2.py", line 1, in <module>
        import test1
    ModuleNotFoundError: No module named 'test1'

按照一些提示,我尝试运行产生相同结果的不同版本的代码:

# main.py alternative

from testpack.test2 import demo2

demo2()

我错过了什么?我的逻辑是,当导入testpack.test2Python 时,它会进入test2.py它必须导入的地方test1。导入test1应该不是问题,因为我们可以成功地test2.py自行运行,所以它会demo2()使用 from 函数构建test1,我就完成了,但我显然错了。在某一时刻,我认为import testpack.test1之前运行import testpack.test2可能会带来问题,因为我会导入test1两次(test2也导入一次),但是由于没有运行的替代版本,main我完全迷失了。

已解决:根据 MisterMiyagi 的建议,解决方案是使用 from . import test1而不是import test1in test2.py。点表示要导入的文件与当前文件位于同一目录,双点表示要导入的文件位于父目录等。我发现这篇文章很有帮助https:// /realpython.com/absolute-vs-relative-python-imports/

标签: pythonimportmodulepython-modulepython-packaging

解决方案


推荐阅读