【问题标题】:Creating a package with several sub-packages in Python在 Python 中创建一个包含多个子包的包
【发布时间】:2016-07-15 11:32:09
【问题描述】:

我正在尝试在 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'

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

【问题讨论】:

  • subpackage1 必须有一个__init__.py 才能被检测为模块。您在src 中添加了__init__.py,但在subpackage1 中没有添加。
  • @GIRISHRAMNANI - 谢谢。我间歇性地在那里有一个,但不确定是否有必要。有一个在那里似乎并没有改变任何东西。所以需要一些其他的东西来......

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


【解决方案1】:

如果你想从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()

【讨论】:

  • 但是我可以尝试import subpackage1.src.functions 并执行functions.function1() 吗?它不起作用。为什么?
【解决方案2】:

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

/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 以检查那里的导入错误。

【讨论】:

    【解决方案3】:

    在您的my_program.py 中添加import subpackage1.src.functions as f

    运行模块时,进入package文件夹,如下运行:

    python -m subpackage1.src.my_program

    【讨论】:

      猜你喜欢
      • 2020-05-02
      • 2019-07-01
      • 2013-05-01
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多