【问题标题】:Distribute Python applications "with" a venv“使用” venv 分发 Python 应用程序
【发布时间】:2015-08-20 05:18:36
【问题描述】:

假设我有一个 Python 应用程序,它将用作命令行工具。这个应用程序有一些外部依赖项。我将如何分发这个?

我知道在虚拟环境(virtualenv 或 pyvenv)中安装 Python 东西很常见,但如果要从命令行使用该应用程序,我不希望我或我的用户激活正确的虚拟环境每次他们想使用我的应用时。

有解决办法吗?还是我应该将所有依赖项都放在 setup.py 中,让用户自己决定是否创建虚拟环境?

【问题讨论】:

  • “或者我应该将所有依赖项都放在 setup.py 中,然后由用户决定是否创建虚拟环境?” - 是的,就是这样。
  • 如果你在全局安装一个应用程序(包),它的依赖项也将在全局安装......你可能应该阅读this

标签: python virtualenv software-distribution


【解决方案1】:

我将提到一个替代解决方案,其中包含requirements.txt 文件为pip。请参阅文档:

https://pip.pypa.io/en/latest/user_guide.html#requirements-files

然后用户知道您的应用有哪些依赖项,并可以使用pip install -r requirements.txt 轻松地将它们安装到他/她的虚拟环境中。

使用pip freeze > requirements.txt 可以轻松创建文件。

【讨论】:

  • 好的,谢谢。我知道如何像这样分发,但我认为有一种方法可以让 setuptools 创建一种 venv,而最终用户不必意识到这一点。我想我记错了;)谢谢你的建议!
  • 不,这不是 requirements.txt 的内容。命令行工具就像一个库。请在setup.py 中使用install_requires。如果您不确定,请使用您最喜欢的搜索引擎。
【解决方案2】:

使用setup.py 并列出install_requires 中的依赖关系。

现在到“如何分发这个?”部分。

在我们公司,我们运行自己的 pypi 服务器。安装在我们服务器上的每个包都必须来自我们的 pypi 服务器。没有软件会直接从 Internet 下载到服务器。

如果你想构建一个开源工具,你应该把它上传到官方的pypi服务器。

该工具不应该关心它的环境。它应该可以在 virtualenv 和外部环境中工作。

也许示例项目对您有帮助:https://github.com/pypa/sampleproject

【讨论】:

  • 谢谢,将您的答案更改为已接受的答案,因为setup_requires 确实是命令行工具的更好选择:)
  • 如果您对我的回答有任何疑问,可以发表评论:-)
【解决方案3】:

这有点取决于您认为谁会使用您的应用程序。如果您通过 pip 分发它,您的用户应该能够决定是否使用 virtualenv。如果您希望您的用户简单地从网站下载您的脚本(甚至可能适用于 Windows)并且它“简单地工作”,您可以捆绑您的依赖项(甚至可能是 python 解释器),然后相应地修改 PYTHONPATH。当然,您也可以使用不同的方式进行分发,例如docker image

【讨论】:

    猜你喜欢
    • 2011-12-05
    • 2020-01-25
    • 2020-10-08
    • 2019-11-05
    • 2010-09-14
    • 2021-05-21
    • 1970-01-01
    • 2010-10-30
    • 2011-03-27
    相关资源
    最近更新 更多