setup.py + virtualenv =鸡肉和鸡蛋问题?

时间:2017-01-13 17:07:12

标签: python virtualenv

我是Java / Scala开发人员,为工作项目过渡到Python。为了清除我脑中Python方面的蜘蛛网,我编写了一个webapp,在进行本地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 - 考虑什么"最佳做法"在这种情况下?

2 个答案:

答案 0 :(得分:1)

您可以将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的工具。它对部署有很大帮助。

答案 1 :(得分:-1)

Python默认包路径始终指向系统环境,需要管理员访问才能安装。 Virtualenv能够将安装本地化到隔离环境。

对于软件包的部署/分发,您可以选择

  1. 按源代码分发。用户需要运行python setup.py --install
  2. 打包您的python包并上传到Pypi or custom Devpi。因此,用户只需使用pip install <yourpackage>
  3. 即可

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

    此外,Pypi包装世界包含一定数量的经过严格测试的包装,并不能开箱即用。

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