【问题标题】:Python - setuptools - working on two dependent packages (in a single repo?)Python - setuptools - 处理两个依赖包(在一个仓库中?)
【发布时间】:2017-10-16 16:02:13
【问题描述】:

我正在开发一个包含两个模块的 python 项目。这些模块密切相关,因此我希望它们位于同一个 git 存储库中,并且能够在我的 IDE 中一起开发它们:

  • module1 取决于 module2
  • module1 有很多其他的重度依赖,module2 没有
  • module1module2 将用于不同的运行时环境
  • module2 应该可以单独安装,以便它可以在例如运行。 AWS Lambda

因此,我尝试建立一个项目结构,其中包含一个 repo 中两个文件夹中的两个模块,每个文件夹都有一个setup.py,因此可以打包。这是一个合理的方法吗?

\module1
  setup.py
  \module1
    __init__.py
    [scripts].py
\module2
  setup.py
  \module2
    __init__.py
    [scripts].py

上述结构应该允许我在本地处理项目,将module2 视为常规模块,但setup.py 文件意味着它可以作为自己的包分发,对吧?

问题是我不能在module1setup.py 中包含module2 依赖项:

from setuptools import setup

setup(
    name="module1",
    version="0.1",
    packages=['module1'], # I really need to include module2 scripts here, right?...
    install_requires=['pandas', 'numpy', ...]
)

有人对如何解决这个问题有任何建议吗?我能猜到的两个解决方案是:

  • 在依赖 module1 之前自行打包和发布 module2。这使得开发更加不灵活
  • module2 嵌套在module1 中,这样我就可以将它包含在setup(...) 函数的packages 参数中。这打破了module1 应该将module2 视为本质上是外部依赖项的清晰度......

【问题讨论】:

    标签: python setuptools pypi


    【解决方案1】:

    将它们保存在同一个存储库中的主要原因是为了在 IDE 中的两个模块上启用并行工作。我建议将模块保存在单独的存储库中,并为pip 使用editable 模式或为setuptools 使用develop 模式以实现“并行”开发。

    本质上,当您在module1 中使用module2 时,您将在develop/editable 模式下安装它。此后,您将在开发module1 时立即看到对module2 所做的所有更改

    这样做还可以确保pip install git+<git_directory> 之类的东西不会中断,您可以直接从git 安装

    【讨论】:

    • 谢谢@Rubbal。因此,如果我要使用两个单独的 repos 和 setuptools 开发模式,我将如何在 setup.py 中声明 module1module2 的依赖?我理解使用pip -e [path],但setup.py 中的等价物是什么?
    • 您只需将其添加到install_requires (我曾经保留一个 requirements.txt 以便我可以在开发时直接安装所有需求。在 setup.py 中,我会解析 requirements.txt 和将它们添加到 install_requires)
    • 我认为这可能是正确的答案(尽管我从未让install_requires 正常工作)。我想我的问题实际上是是否有/应该有一种机制来从一组代码构建多个 PyPI 样式包。似乎使用 setuptools 进行构建步骤不是那么灵活...
    猜你喜欢
    • 2015-09-19
    • 2011-01-02
    • 2014-06-28
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    相关资源
    最近更新 更多