我目前正在阅读有关子模块导入中的Python子模块的信息,但以某种方式我找不到合适的答案。这里是一个例子:
root/
main.py
moduleA/
__init__.py
log.py
moduleB/
__init__.py
worker.py
我想使用log
在worker
中导入import moduleA.log
。而且我想在worker
中导入main
并在那里使用它。
到目前为止,我已经找到了以下解决方案:
sys.path
上附加../
(sys.path.append('../')
)pip -e
将模块安装到环境中的信息我读到sys.path
骇客被认为是最好的主动手段。但是不知何故。
所以我想知道您认为什么是最佳实践。
答案 0 :(得分:1)
您可以使用相对导入来解决此问题:
在main.py
中写
from .moduleB import worker
在worker.py
中:
from ..moduleA import log
一个点将当前目录作为路径的开头,因此.moduleB
会挖入当前目录下的文件夹moduleB
。
两点向上移动一个目录,因此..moduleA
进入root
目录,然后下降至moduleA
。每个附加点都是一个目录。
F.i. from . import ab
将从同一目录导入ab.py
。
打包/安装模块不是进行相对导入的必要条件。但是您必须使用from ..moduleA import log
进行导入。使用import ..moduleA.log
导入不适用于相对导入。
答案 1 :(得分:0)
我个人更喜欢更改当前工作目录并导入,以防万一我遇到此问题。
root/
__init__.py
root.py
modulea/
__init__.py
a.py
moduleb/
__init__.py
b.py
给出这样的设置
a.py
def a():
print("i am a")
然后在b中,只需通过os.chdir
使用绝对路径或相对路径将当前目录更改为root即可。
b.py
def b():
print("i am b")
import os
os.chdir('..')
from modulea.a import a
a()
运行b.py打印i am a
其他选项在那里,可以修改sys.path或PYTHONPATH。 Refer here
不过,我也建议您尽可能避免这种情况。
答案 2 :(得分:0)
我通常将使用一个包含所有导入内容的modulename.py
文件,稍后我将对其进行引用:
使用您的结构:
root/
__init__.py
root.py
modulea/
__init__.py
a.py
moduleb/
__init__.py
b.py
root.py
将是:
from modulea.a import sleep, eat, breath
from moduleb.b import read, write, watch
以后我可以做
from package.root import sleep, read, watch
但是,这需要安装您的软件包,但这可能并不总是实用的。