在Python中创建包含多个子包的包

时间:2016-03-28 08:09:48

标签: python python-3.x import module package

我正在尝试用Python创建一个包,其中包含许多子包(我不确定它们是否适合它们)需要互操作。

我有一个(简化的)结构:

/package
    |-script1.py
    |-script2.py
    |-subpackage1
    |   |-__init__.py
    |   |-src
    |   |   |-__init__.py
    |   |   |-my_program.py
    |   |   |-functions.py
    |   |   |-...
    |
    |-tests
    |    |-a_tests.py
    |-subpackage2
    |    |-web-server.py
    |    |-API
    |    |    |-__init__.py
    |    |    |-REST.py
    |    |    |-...
  • package/subpackage2需要能够致电package/subpackage1/src/functions.py
  • package/tests调用两个子包(使用pytests)。
  • package/subpackage1/src/functions.py需要能够调用subpackage1
  • 中的其他模块

我已经看到了这个答案:https://stackoverflow.com/a/33195094 - 这解释了我需要做什么(创建一个包),但它并没有解释如何这样做

我可以很容易地使用以下两个scripts调用其组件子包:

import subpackage1.src.my_program.py

(即类似于建议here)但随后my_program.py失败并显示ImportError: No module named 'functions'

那么,我需要用什么胶水来设置这个结构呢?

3 个答案:

答案 0 :(得分:4)

如果您要将functions.py中的内容导入my_program.py,那么在my_program.py中,您必须指定绝对导入路径。

让我们说functions.py包含以下功能:

def function1():
  print('foo bar')

然后,要将function1functions.py导入my_program.py,其内容应如下所示:

from subpackage1.src.functions import function1

function1()

答案 1 :(得分:3)

所以要解决这个问题我创建了一个类似的文件夹结构

/package
    |-script1.py
    |-subpackage1
    |   |-__init__.py
    |   |-src
    |   |   |-__init__.py
    |   |   |-functions.py

我的script1.py文件有

import subpackage1
import subpackage1.src
import subpackage1.src.functions as f


print(f.hello())

我的functions.py文件有

def hello():
    return "from the functions"

现在来自package文件夹

我做了

$ python script1.py

脚本运行并输出

from the functions

显示。

我正在使用python3

所以我错过了一些东西,因为它在我的系统上工作。

注意:我添加了三个不同的imports来检查那里的导入错误。

答案 2 :(得分:1)

import subpackage1.src.functions as f

中添加my_program.py

运行模块时,请站在package文件夹中,然后运行如下:

python -m subpackage1.src.my_program