8

到目前为止,我们通过自定义 pypi 服务器安装了psutil 。

现在我们有了一个不应该安装 gcc 的新环境。

现在旧方式(pip 在安装期间启动 gcc)不再起作用。

上下文:

  • Linux 服务器
  • 虚拟环境中的python
  • 所有代码都需要从我们的数据中心部署(没有互联网接入)

我看到了这些选择:

转速

创建一个 RPM。因为我们已经用--system-site-packages这个作品运行了我们的 virtualenv。这会强制服务器上的所有 virtualenvs 使用相同版本的psutil. 但这不会有什么大问题。

车轮

我从来没有用过。

冻结

使用类似的工具cx_freeze。我以前从来没有这样做过。

其他解决方案?

我想还有其他可能更好的方法来解决这个问题。

背景

psutil在这种情况下只是一个例子。其他包含 c 扩展的 python 包也会出现同样的问题。想象一下,这里还没有 RPM。

4

2 回答 2

7

最惯用的方法是使用轮子。实际上,您的用例是创建车轮格式的原因之一。

构建平台轮很容易:

python setup.py bdist_wheel

您可能会收到错误“无效命令 'bdist_wheel'”。在这种情况下,您必须安装wheel软件包:

pip install wheel

构建轮子后,它位于例如dist/psutil-4.2.0-cp27-cp27mu-linux_x86_64.whl. 您可以通过以下方式安装它:

pip install dist/psutil-4.2.0-cp27-cp27mu-linux_x86_64.whl

一般来说,安装和使用轮子只能在二进制兼容的系统上工作。由于在不同的 Linux 发行版和版本中不能保证这一点,因此在将轮子上传到中央 PyPI 时存在限制。运行您自己的 PyPI 服务器时,这些限制不适用。

您可以通过以下方式将轮子上传到您的自定义 PyPI:

python setup.py bdist_wheel upload --repository <url-to-custom-pypi>

并从您的自定义 PyPI 安装它,例如:

pip install --index-url <url-to-custom-pypi> psutil
于 2016-05-28T20:59:46.307 回答
1

封装方法(rpm、deb、wheel 等)存在一些缺点:

  • 可能需要的 C 库二进制文件不可移植。这意味着如果环境具有不兼容的库,它可能会失败
  • 您需要努力保持 QA 环境和生产环境完全相同,并使用相同的 lib 版本。否则,您可能会在生产过程中遇到质量检查无法发现的问题。我遇到了这个问题,例如,MySQL 驱动程序的一个版本仅在生产中出现恐慌。

因为,IMO,最好的解决方案是一个 docker 容器,它可以在任何环境中提供完全相同的库。不过,在你的情况下可能有点矫枉过正。

如果您习惯使用 docker,那非常简单:

RUN deps='gcc make'; 
    && apt-get update && apt-get install -y $deps --no-install-recommends 
    && pip install MySQL-python
    && apt-get purge -y --auto-remove $deps

该示例在一行中完成所有操作,以避免将中间文件捆绑到 docker 映像中。

如果您在https://superuser.com/中询问此问题,我想这也是直接的方法。如果你不习惯 docker,这里有一个小教程:

Docker 解释:如何容器化 Python Web 应用程序

于 2016-06-01T21:19:18.367 回答