到目前为止,我们通过自定义pypi服务器安装了psutil。
现在我们有了一个新的环境,我们不应该安装gcc。
现在旧的方式(pip在安装期间启动gcc)不再起作用了。
背景信息:
我看到了这些替代方案:
创建RPM。既然我们已经用--system-site-packages
运行了virtualenv,那么这就行了。这会强制服务器上的所有virtualenvs使用相同版本的psutil
。但这不是什么大问题。
我从未使用过它。
使用cx_freeze
之类的工具。我以前从未这样做过。
我想还有其他方法可能更好解决这个问题。
psutil
只是一个例子。其他包含c扩展的python包也出现了同样的问题。想象一下,这里还没有RPM。
答案 0 :(得分:6)
最惯用的方法是使用轮子。实际上,您的用例是创建轮盘格式的原因之一。
构建platform wheel非常简单:
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时会有restrictions。运行自己的PyPI服务器时,这些限制不适用。
您可以通过以下方式将滚轮上传到自定义PyPI:
python setup.py bdist_wheel upload --repository <url-to-custom-pypi>
并通过例如:
从您的自定义PyPI安装它pip install --index-url <url-to-custom-pypi> psutil
答案 1 :(得分:1)
包装方法有缺点(rpm,deb,wheel等):
因为IMO,最好的解决方案是一个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 Explained: How To Containerize Python Web Applications