Python软件包脱机安装

下载一个python软件包的最佳方式是什么,它是从pypi的依赖关系在另一台机器上离线安装? 有没有简单的方法来做到这一点用pip或easy_install? 我试图在未连接到互联网的FreeBSD盒子上安装请求库。

6 Solutions collect form web for “Python软件包脱机安装”

如果软件包在PYPI上,请将其及其依赖项下载到某个本地目录。 例如

 $ mkdir / pypi && cd / pypi
 $ ls -la
   -rw-r  -  r-- 1 pavel staff 237954 Apr 19 11:31 Flask-WTF-0.6.tar.gz
   -rw-r  -  r-- 1 pavel staff 389741 Feb 22 17:10 Jinja2-2.6.tar.gz
   -rw-r  -  r-- 1 pavel staff 70305 Apr 11 00:28 MySQL-python-1.2.3.tar.gz
   -rw-r  -  r-- 1 pavel staff 2597214 Apr 10 18:26 SQLAlchemy-0.7.6.tar.gz
   -rw-r  -  r  -  1 pavel staff 1108056 Feb 22 17:10 Werkzeug-0.8.2.tar.gz
   -rw-r  -  r-- 1 pavel staff 488207 Apr 10 18:26 boto-2.3.0.tar.gz
   -rw-r  -  r-- 1 pavel staff 490192 Apr 16 12:00 flask-0.9-dev-2a6c80a.tar.gz

有些软件包可能需要手工归档到类似的外观包中。 当我想要一个更新的(不太稳定的)版本的东西的时候,我会做很多事情。 有些软件包不在PYPI上,所以也适用于它们。

假设你在~/src/myapp有一个正确的Python应用程序。 ~/src/myapp/setup.py将会有install_requires列表,提到你在/pypi目录下有一个或多个东西。 像这样:

  install_requires=[ 'boto', 'Flask', 'Werkzeug', # and so on 

如果您希望能够在运行您的应用程序时保留所有必要的依赖关系,那么您可以执行如下操作:

 $ cd〜/ src / myapp
 $ python setup.py develop --always-unzip --allow-hosts = None --find-links = / pypi

这样,您的应用程序将直接从您的源代码目录执行。 你可以破解一些东西,然后重新运行应用程序,而不用重build任何东西。

如果你想在当前的python环境下安装应用程序及其依赖项,你可以这样做:

 $ cd〜/ src / myapp
 $ easy_install --always-unzip --allow-hosts = None --find-links = / pypi。

在这两种情况下,如果/pypi目录中不存在一个或多个依赖项,构build将会失败。 它不会试图从互联网混杂安装丢失的东西。

我强烈build议在活动的虚拟环境中调用setup.py develop ...easy_install ...以避免污染您的全局Python环境。 这是(virtualenv)是相当多的路要走。 切勿在全球Python环境中安装任何东西。

如果您构build应用程序的计算机具有与您要在其上部署计算机的计算机相同的体系结构,则可以简单地对整个虚拟环境目录进行压缩,其中包含easy_install everything。 就在tarballing之前,您必须使虚拟环境目录可重新定位(请参阅–relocatable选项)。 注意:目标机器需要安装相同版本的Python,并且还必须预先安装应用程序可能具有的任何基于C的依赖项(例如,如果您依赖于PIL ,则必须预先安装libpng,libjpeg等) 。

我使用-d (或--download )选项来进行pip install ,这使得从PyPI下载sdist tarballs的过程变得更加简单。 例如, pip install --download /path/to/some/dir celery会将芹菜及其所有依赖项的sdist tarball下载到/path/to/some/dir (但不会安装它们)。 然后,你可以使用pip install --no-index --find-links /path/to/some/dir/ celery来使用下载的sdist安装celery,而无需访问networking。

如果在两个命令中用-r requirements.txt代替celery ,其中requirements.txt是一个pip要求文件,列出了所有需要的软件包(以及可选的所需版本)。

UPDATE

DEPRECATION:pip install –download已被弃用,将来会被删除。 点子现在有一个下载命令,应该用来代替。

命令是这样的:
pip download -r requirements.txt

对于python3:
pip3 download -r requirements.txt

下载tarball ,把它传送到你的FreeBSD机器并解压缩,之后运行python setup.py install ,就完成了!

编辑:只是要补充一点,你现在也可以用pip安装tarball。

对于Pip 8.1.2,您可以使用pip download -r requ.txt将软件包下载到本地计算机。

使用wheel编译包。

打包:

 $ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX) $ pip wheel -r requirements.txt --wheel-dir=$tempdir $ cwd=`pwd` $ (cd "$tempdir"; tar -cjvf "$cwd/bundled.tar.bz2" *) 

复制压缩包并安装:

 $ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX) $ (cd $tempdir; tar -xvf /path/to/bundled.tar.bz2) $ pip install --force-reinstall --ignore-installed --upgrade --no-index --no-deps $tempdir/* 

wheel二进制包不跨机器。

更多参考 这里: https : //pip.pypa.io/en/stable/user_guide/#installation-bundles

离线python。 为此我使用virtualenv(独立的Python环境)

1)用pip在线安装virtualenv:

 pip install virtualenv --user 

或使用whl离线:转到此链接 ,下载最新版本(.whl或tar.gz)并使用以下命令安装:

 pip install virtualenv-15.1.0-py2.py3-none-any.whl --user 

通过使用 – 用户你不需要使用sudo pip…

2)使用virtualenv

select一个terminalcd目录并运行以下代码:

 python -m virtualenv myenv cd myenv source bin/activate pip install Flask 

在安装所有软件包之后在在线机器上,你必须生成一个requirements.txt所以当你的virtualenv处于活动状态时,写

 pip freeze > requirements.txt 

然后创build另一个env,如myenv2

 python -m virtualenv myenv2 cd myenv2 source bin/activate cd - ls 

现在,您可以转到脱机文件夹,其中有您的requirements.txttranferred_packages文件夹。 用下面的代码下载软件包,把它们全部放到tranferred_packages文件夹中。

 pip download -r requirements.txt 

把你的脱机文件夹脱机电脑,然后

 python -m virtualenv myenv2 cd myenv2 source bin/activate cd - cd offline pip install --no-index --find-links="./tranferred_packages" -r requirements.txt 

离线文件夹中的内容[requirements.txt,tranferred_pa​​ckages {Flask-0.10.1.tar.gz,…}]

检查你的软件包列表

 pip list 

注意:因为我们在2017年,最好使用python 3.你可以用这个命令创buildpython 3 virtualenv。

 virtualenv -p python3 envname 
  • 正确的方法来尝试/除了使用Python请求模块?
  • 代理与Python“请求”模块
  • asynchronous请求与Python请求
  • 为什么不requests.get()返回? requests.get()使用的默认超时是多less?
  • 超时python requests.get整个响应
  • Python请求requests.exceptions.SSLError: _ssl.c:504:EOF违反协议
  • 如何使用Python的Requests模块“login”到一个网站?
  • Python请求使用保持活动加速
  • 我怎样才能看到我的Python应用程序发送的整个HTTP请求?
  • Python请求 - 打印整个HTTP请求(原始)?
  • Python请求和持久会话