2012-06-18 162 views
82

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

+1

相关:[如何根据requirements.txt从本地目录安装软件包?](http://stackoverflow.com/q/7225900/95735) –

回答

42

如果软件包位于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 

某些软件包可能需要手动归档到类似的外观tarball中。当我想要更新的(不太稳定的)版本的东西时,我会做很多事情。一些软件包不在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 

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

如果你想安装你的应用和它的依赖到当前Python环境,你会做这样的事情:

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

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

我强烈建议在有效的virtual environment之内调用setup.py develop ...easy_install ...以避免污染您的全局Python环境。这是(virtualenv),相当多的路要走。切勿在全球Python环境中安装任何东西。

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

+2

而不是'--allow-hosts = None'您可以使用开关'--no-index' – romor

+0

请您详细说明如何创建一个正确形成的Python应用程序? –

+2

@PrabhjotRai请参阅https://packaging.python.org/distributing/ –

4

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

编辑:只需添加一下,你也可以现在用pip安装tarball。

+1

所有依赖关系如何?解决它们的最好方法是什么?我是否也需要手动安装依赖关系? –

+0

是的,这是我知道的唯一方式。 – dav1d

157

我使用-d(或--download)选项到pip install,这使得从PyPI下载sdist tarball的过程变得更加简单。例如,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安装芹菜,而无需访问网络。如果您在这两个命令与-r requirements.txt,其中requirements.txt是一个点要求文件列出所有你需要的软件包取代celery(也可以选择你想要的版本)

的同样的过程。

UPDATE

弃用:PIP安装 - 表格下载已被弃用,并将于 在未来删除。 PIP现在有一个download命令,应该使用 。

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

对于python3:
pip3 download -r requirements.txt

+0

问题是,依赖项可能具有其他依赖项,并且这些依赖项不会被下载。 – vikki

+0

[Snake basket](https://github.com/prezi/snakebasket)(建立在pip之上)也会下载依赖关系的依赖关系。 – vikki

+4

@vikki不正确,“pip install --download”也会下载依赖关系,因此即使您的需求具有其他依赖关系,上述命令也能正常运行。 Snake篮子可能会做其他有用的事情(从未使用过),但这绝对不是必需的。 –

2

画中画8.1.2,您可以使用pip download -r requ.txt将包下载到本地计算机。

2

脱机python。这样做的我使用的virtualenv(隔离Python环境)

1)安装的virtualenv 在线与PIP:

pip install virtualenv --user 

或脱机WHL:去这个link,下载最新版本(.whl或焦油。 GZ)并安装使用下面的命令:使用--user

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

你不需要使用sudo pip…

2)使用在线机器上的virtualenv

选择与终端cd一个目录,并运行此代码:

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

安装所有的包后,你必须生成一个requirements.txt所以当你的virtualenv是激活,写入

pip freeze > requirements.txt 

打开一个新的终端并创建另一个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 {烧瓶0.10.1.tar.gz,...}你的包

pip list 

注意]

检查表:因为我们是在2017年,最好是使用Python 3哟你可以用这个命令创建python 3 virtualenv。

virtualenv -p python3 envname 
+0

似乎有步骤丢失或“混淆”在这里,我希望看到一个'停用',然后'点冻结'...离线和./tranferred_pa​​ckages出现从无处 - 显然这需要清理? – Hannu

+0

也许,但你应该考虑'我想要一个简短的帖子','这个过程很复杂,我不能写每一步(只有在YouTube上才有可能)“。 – cyera

2

使用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

+1

我在使用Python 3.6绑定到机器上时遇到了问题,而在使用Python 3.5解压时出现了问题:“_ .whl在此平台上不受支持”。源和目标版本可能需要与某些软件包匹配。 –