setup.py + virtualenv = 先有鸡还是先有蛋的问题?

setup.py + virtualenv = chicken and egg issue?

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

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

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

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

中了解更多信息

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

完全清除 virtualenv

还有一件事,请不要放像 pip freeze 这样的严格版本的包,大多数时候你想要 >= 至少 X.X 版本。好消息是 pip 会自行处理依赖项。这意味着你不必把依赖包放在那里,pip会解决它。

谈到部署,您可能需要查看 tox,这是一个用于管理 virtualenvs 的工具。它对部署有很大帮助。

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

对于deployment/distribution的套餐,您可以选择

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

但是,正如您在顶部注意到的问题:没有 virtualenv,他们的用户需要管理员权限才能安装任何 python 软件包。

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

注:virtualenv itself is actually a hack to achieve isolation