子模块中的Python最佳实践导入子模块

时间:2018-12-11 15:15:17

标签: python python-module

我目前正在阅读有关子模块导入中的Python子模块的信息,但以某种方式我找不到合适的答案。这里是一个例子:

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

我想使用logworker中导入import moduleA.log。而且我想在worker中导入main并在那里使用它。

到目前为止,我已经找到了以下解决方案:

  • sys.path上附加../sys.path.append('../')
  • 我读了一些有关使用pip -e将模块安装到环境中的信息
  • 避免从子模块导入脚本

我读到sys.path骇客被认为是最好的主动手段。但是不知何故。

所以我想知道您认为什么是最佳实践。

3 个答案:

答案 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

但是,这需要安装您的软件包,但这可能并不总是实用的。