python - 如何在 Python 中使用相互引用的模块编写包?
问题描述
我正在尝试制作一个包含相互导入的模块的包,但我对它的工作原理感到非常困惑。我制作了三个文件:test1.py
,它们包含在我的包目录test2.py
中。文件内容如下:__init__.py
testpack
# 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.test2
Python 时,它会进入test2.py
它必须导入的地方test1
。导入test1
应该不是问题,因为我们可以成功地test2.py
自行运行,所以它会demo2()
使用 from 函数构建test1
,我就完成了,但我显然错了。在某一时刻,我认为import testpack.test1
之前运行import testpack.test2
可能会带来问题,因为我会导入test1
两次(test2
也导入一次),但是由于没有运行的替代版本,main
我完全迷失了。
已解决:根据 MisterMiyagi 的建议,解决方案是使用 from . import test1
而不是import test1
in test2.py
。点表示要导入的文件与当前文件位于同一目录,双点表示要导入的文件位于父目录等。我发现这篇文章很有帮助https:// /realpython.com/absolute-vs-relative-python-imports/
解决方案
推荐阅读
- ajax - Magento 2 How to pass js variable to controller and then call template with custom code?
- python - How to make arrow move randomly on a Canvas image?
- django - Getting "curl: (92) HTTP/2 stream 1 was not closed cleanly: INTERNAL_ERROR (err 2)"
- django - Django: how to use {{ something }} inside css file
- mysql - 在 ManyToMany 双向映射中,findAll() 获取行,每行都包含其子项,而子项又包含自身
- java - App force closes with an error: java.lang.RuntimeException: Unable to start activity ComponentInfo
- firebase - 构建 Firestore 数据以实现高效读取
- c++ - How to fix qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed error in QT
- angular - 将参数添加到有效的选择器
- ionic3 - Unsubscibe from firestore onSnapshot listener when the user just exits from the app