Python最佳实践:在子模块中导入子模块。

3

我正在阅读有关Python子模块中的子模块导入的内容,但不知何故找不到合适的答案。以下是一个示例:

root/
     main.py
     moduleA/
             __init__.py
             log.py
     moduleB/
             __init__.py
             worker.py

我希望通过使用“import moduleA.log”,在“worker”中导入“log”。我还想在“main”中导入“worker”并在那里使用它。
到目前为止,我找到了以下解决方案:
- 使用“sys.path.append('../')”将“sys.path”附加到“../”。 - 我看到了一些关于使用“pip -e”将我的模块安装到环境中的内容。 - 避免从子模块导入的脚本。
据我所知,“sys.path”方法被认为是最佳实践。但是,这种方法感觉不对。
因此,我想知道您认为哪种方法是最佳实践。
3个回答

2
你可以使用相对导入来解决这个问题:
main.py 中写入:
from .moduleB import worker

worker.py文件中:
from ..moduleA import log

一个点以当前目录作为路径的起始点,所以.moduleB会进入当前目录下的moduleB文件夹。
两个点向上移动一个目录,所以..moduleA会到达root目录,然后进入moduleA。每增加一个点就向上移动一个目录。
例如:from . import ab将从同一目录中导入ab.py
打包/安装模块并不需要进行相对导入。但是您必须使用from ..moduleA import log进行导入。使用import ..moduleA.log进行导入将无法进行相对导入。


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

然而,这需要安装您的软件包,这可能并不总是切实可行的。


-1

就编程而言,我个人更喜欢更改当前的工作目录并进行导入,以防万一遇到此问题。

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 将当前目录更改为根目录即可。

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的修改。在这里参考

然而,我建议尽可能避免这种情况。


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