Python bdist并在不使用PyPi的情况下分发安装包

时间:2012-09-25 19:31:49

标签: python virtualenv pip

我正在开发一个本身并不复杂的系统:只是一个带有一系列包的virtualenv,每个包都有自己的依赖。所有告诉(有依赖),需要安装大约30个包。

以下限制使设置有些复杂化:

  • 无法保证可以访问互联网。实际上我们假设PyPI在安装时不可用。 (非网络debian稳定存储库 可用,允许virtualenv和公司)
  • 某些软件包/依赖项具有C扩展,这对应用程序的性能至关重要。
  • 希望预先编制C扩展,以避免安装GCC和公司。

在这些约束中,包装(然后安装)python模块依赖项的最快,最简单甚至(最好)“正确”的方法是什么?我是否只抓住每个包的来源并自己做一次?

3 个答案:

答案 0 :(得分:5)

这个问题有点陈旧,但无论如何,自pip版本1.4(2013-07-23)以来,已经支持wheel作为二进制分发格式,具有更丰富的界面和更好的支持。对于那些找到这个主题的人,考虑使用wheel而不是egg。

示例用法(来自车轮文档):

  

为您的需求及其所有依赖项构建轮子   本地目录:

pip install wheel
pip wheel --wheel-dir=/local/wheels -r requirements.txt
     

然后只使用本地目录安装这些要求   轮子(而不是来自PyPI):

pip install --no-index --find-links=/local/wheels -r requirements.txt

答案 1 :(得分:1)

pip --find-links选项支持本地目录。只需将所有sdist和egg发行版放入一个目录中,pip就会在那里找到它们。

二进制发行版,我将构建为egg(带setup.py bdist_egg),以便于安装而无需编译。

答案 2 :(得分:0)

我现在确定的方法是this

# To gather together all of the dependencies (ex: pymongo, ujson):
easy_install -zmaxd /my/packaging/directory pymongo>=2.3 ujson

# Secondarily, package my custom module
/mymodule/setup.py sdist
cp /mymodule/dist/mymodule.tar /my/packaging/directory/

后来,由于世界上大多数版本的pip不支持egg,所以也可以使用easy_install进行安装。 (pip的最新版本,我理解,但不是每个人都是最新的):

easy_install -H None -f file:///installed/packaging/directory mymodule

mymodule的依赖关系仍然看看它是否有效,但似乎接近于“正确”的做事方式。

感谢Martijn指点我的鸡蛋。