Python打包分发场景

标签 python package setuptools python-wheel

我对 python 打包还是比较陌生,每次我认为我找到了“那个”解决方案时,我都会抛出另一个曲线球,这是我遇到的问题以及我尝试过的问题:

  • 我有安装了 Python 2.7.3 的 CentOS 和 Ubuntu 系统,它们是从网络分区的,所以我必须创建一个“多合一包”
  • 目标系统没有安装了 setuptools、easy_install、pip、virtualenv(这是我要在这里解决的问题)
  • requirements.txt(或 setup.py install_dependencies)对于应用程序来说相当繁重(Flask 等...)(尽管实际上,这不是问题所在)

我的包装成熟度进步缓慢:

对于连接的系统,我有一个非常好的过程

  • 打包:python2.7 setup.py sdist
  • 安装:创建一个virtualenv,解压发行版,python setup.py install

对于断开连接的系统,我尝试了一些方法。 Wheels 似乎是合适的,但我无法进入包括 setuptools、easy_install、pip 的“最终”安装。我是轮子的新手,所以也许我遗漏了一些明显的东西。

我从这些引用文献开始:

  • Python on Wheels ,这非常有用,但我无法安装我的 .sh 脚本、测试数据等...所以我现在实际上正在使用 wheel/sdist 混合体
  • Wheel, the Docs ,再次,非常有帮助,但我被困在“断开连接系统的最后一英里”
  • 然后我发现我可以将 virtualenv 打包成一个轮子 :-) 是的
  • 然后我发现我可以将 easy_install 打包为 python 程序:-) 是的,但这取决于安装工具,糟糕,我找不到如何打包/安装这些工具

是否有关于引导具有 Python、已断开连接但没有安装工具、pip、wheels、virtualenv 的系统的引用?我列出的安装这个简单代理必须做的事情的 list 变得太长了:/我想如果我能完成依赖链,就必须有一种方法可以将自定义脚本锁定到 setup.py 以缩小自定义步骤退缩...

最佳答案

您的过程可能会根据您的目标平台而有所不同,但一般来说,获得您想要实现的目标的典型方法是在在线机器上下载包,将它们复制到离线机器上,然后从文件而不是从 URL 或存储库安装它们)。

基于 RPM 的发行版的可能工作流程可能是:

  1. 安装 python-pip通过二进制包(使用 rpmyum-downloadonly 在线机器上下载包,然后将其复制并安装到离线机器上 rpm -i python-pip.<whatever-version-and-architecture-you-downloaded> )。
  2. 在您的在线计算机上,使用 pip install --download <pkgname>下载您需要的软件包。
  3. scprsync给定目录的包 X到您的离线机器上
  4. 使用pip install --find-links=<your-dir-here> <pkgname>在离线机器上安装软件包。

如果您必须在许多服务器上复制该过程,我建议您在防火墙后面设置自己的存储库。如果是pip , 这很容易,因为这只是告诉 pip 的问题使用一个目录作为它自己的索引:

$ pip install --no-index --find-links=file:///local/dir/ SomePackage

对于 RPM 或 DEB repo 有点复杂(但不是火箭科学!),但可能也不是那么必要,因为你真的只应该安装 python-pip一次。

关于Python打包分发场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25353104/

相关文章:

python - 给出基本的 boto create_qualification_type 示例

r - R中 "Error: package ' ____ _' was built before 3.0.0: please re-install it"的原因

java - 如何使一个方法在所有子包中都可访问

python - 如何使 easy_install 将包扩展到目录而不是单个 egg 文件中?

python - 使用 Distribute 包含包数据

python - 迭代地将字典转换为一组全局变量

Windows 中的 Python 扭曲 OpenSSL 错误

python - xarray 的 apply_ufunc 中 dask=parallelized 和 dask=allowed 有什么区别?

Java NoClassDefFounderror 尝试运行时出错

python - 使 setuptools 与 one_file.py 一起工作的最小目录结构是什么?