【问题标题】:setup.py + virtualenv = chicken and egg issue?setup.py + virtualenv = 鸡和蛋的问题?
【发布时间】:2017-05-29 03:17:01
【问题描述】:

我是一名 Java/Scala 开发人员,正在为一个工作项目过渡到 Python。为了消除 Python 大脑中的蜘蛛网,我编写了一个 web 应用程序,在进行本地 Docker 工作时充当 Docker 的前端。我现在正在打包它,因此,我正在学习setup.py 和 virtualenv。来自 JVM 世界,依赖项没有“安装”,而是下载到存储库并在需要时引用,pip 处理事情的方式有点陌生。生产 Python 工作的最佳实践似乎是首先为您的项目创建一个虚拟环境,进行编码工作,然后将其与setup.py 打包。

我的问题是,当有人需要安装我写的东西时,另一端会发生什么?他们也必须为包创建一个虚拟环境,但如果不检查 setup.py 文件以确定要使用的 Python 版本等,他们将不知道如何设置它。有没有办法让我创建一个setup.py 文件还创建适当的虚拟环境作为安装过程的一部分?如果不是——or if that's considered a "no" as this respondent stated to this SO post——在这种情况下什么被认为是“最佳实践”?

【问题讨论】:

  • 您是在尝试分发您的软件包还是只需要让它在服务器上正常运行?
  • “使用什么版本的 python”应该记录在自述文件中。您的用户需要检查 setup.py 的哪些内容?

标签: python virtualenv


【解决方案1】:

您可以将 virtualenv 视为您使用 pip 安装的每个包的隔离。这是处理不同版本的python和包的简单方法。例如,您有两个项目使用相同的包但版本不同。因此,通过使用virtualenv,您可以隔离这两个项目并分别安装不同版本的软件包,而不是在您的工作系统上。

现在,假设您想和朋友一起做一个项目。为了安装相同的包,您必须以某种方式共享您的项目所依赖的版本和包。如果您要交付一个可重用的包(一个库),那么您需要分发它,在这里setup.py 有帮助。您可以在Quick Start了解更多信息

但是,如果您在网站上工作,您只需将库版本放入单独的文件中。最佳实践是为测试、开发和生产创建单独的需求。为了查看文件的格式 - 写pip freeze。您现在将看到系统(或 virtualenv)上安装的软件包列表。将其放入文件中,稍后您可以将其安装在另一台 PC 上,使用 pip install -r development.txt 完全清除 virtualenv

还有一件事,请不要放像pip freeze这样的严格版本的软件包,大多数时候你希望>=至少是X.X版本。好消息是 pip 自己处理依赖关系。这意味着你不必把依赖包放在那里,pip 会整理出来。

说到部署,你可能想查看tox,一个管理virtualenvs的工具。它对部署有很大帮助。

【讨论】:

  • 是否有一个工具可以检查 setup.py 的内容并在安装过程中创建适当的虚拟环境,或者最终用户是否希望首先检查 README 和/或 setup.py并手动设置虚拟环境?
  • 您可以将setup.py 视为包清单。它声明包的属性及其依赖项。所以最后你有一个library,可以在任何应用程序中分发、安装和重用。
  • virtualenv 必须手动创建,但是必须安装的包可以通过pip install -r list_of_packages_to_install.txt 自动安装到创建的 virtualenv 中 - r 代表递归安装。
  • 这回答了我的问题 -- t/y !
【解决方案2】:

Python 默认包路径总是指向系统环境,需要管理员权限才能安装。 Virtualenv 能够将安装本地化到一个隔离的环境。

对于包的部署/分发,你可以选择

  1. 按源代码分发。用户需要运行python setup.py --install,或者
  2. 打包你的python包并上传到Pypi or custom Devpi。所以用户可以简单地使用pip install <yourpackage>

但是,您注意到上面的问题:如果没有 virtualenv,他们的用户需要管理员权限才能安装任何 python 包。

此外,Pypi 包世界包含一定数量的测试不佳的包,这些包不能开箱即用。

注意:virtualenv itself is actually a hack to achieve isolation

【讨论】:

  • 有趣的文章——尤其是作者在最后声明他不使用 pip/virtualenv 等进行开发。在这样做的过程中,他似乎要么使用其他一些虚拟化手段,要么处理这样一个事实,即他不能让一些项目在同一个盒子上共存而不遇到不可靠的东西。
  • @DavidHoliday 实际上,所有语言在持续集成部署期间都会遇到类似的问题。默认函数结构更改;明确的外部库要求等将打破集成循环。即使像 docker 这样的工具也只能缓解问题,并不能解决问题。
猜你喜欢
  • 2012-05-18
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 2023-03-22
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
相关资源
最近更新 更多