使用pip将Python软件包安装到其他目​​录中吗?


434

我知道明显的答案是使用virtualenv和virtualenvwrapper,但是由于种种原因,我不能/不想这样做。

那么我该如何修改命令

pip install package_name

使pip软件包安装在默认位置以外的地方site-packages



2
现在第二个问题:当您已经安装到自定义目录中时,如何pip不尝试从非自定义目录中删除较旧的版本。例如-一个系统级的,您没有写权限。到目前为止,我只用easy_install...实现了这一点
Tomasz Gandor 2014年

2
@TomaszGandor我认为使用--ignore-installed选项应该可以防止pip尝试卸载已安装的软件包。
Piotr Dobrogost

抱歉,我是pip的新手,但是您的问题与询问“如何将pi安装到不同版本的python”相同吗?我有python 3.4和3.5,但我希望将pip安装转到python 3.5。
查理·帕克

@Charlie Nope,另一个问题。我对您的安装/意图了解不多,但是通常我可能会使用virtualenvwrapper并使用类似以下内容的虚拟环境mkvirtualenv --python=/usr/bin/python3.5 env_name
Monika Sulik

Answers:


334

采用:

pip install --install-option="--prefix=$PREFIX_PATH" package_name

您可能还想--ignore-installed使用此新前缀来强制重新安装所有依赖项。您可以--install-option多次使用以添加可以使用的任何选项python setup.py install--prefix可能是您想要的,但是可以使用很多其他选项)。


5
如果这样做,是否有办法pip freeze查看备用目录?
罗斯,

7
点冻结会在路径上显示,因此,如果您喜欢PYTHONPATH=$PREFIX_PATH/lib/python2.6/site-packages pip freeze它,应该会看到它们。
伊恩·比克

4
使用--prefix=$PREFIX_PATH似乎并不能完全控制安装目录,因为系统目录后缀会附加到该目录(\Lib\site-packages例如,在Windows上)。有没有办法指定特定目录?
Piotr Dobrogost 2012年

1
@Piotr:是的,有我的答案。使用'--prefix'有点粗略,但是如果您希望纯python放在/usr/lib/pythonX.Y/site-packages而不是/usr/local/lib/pythonX.Y/site-packages下,效果很好包。
Anthon 2012年

80
4年前的答案还不错,但是--target选项现在存在。
Tritium21年

545

--target开关是你正在寻找的东西:

pip install --target=d:\somewhere\other\than\the\default package_name

但是您仍然需要添加d:\somewhere\other\than\the\defaultPYTHONPATH该位置才能实际使用它们。

-t,--target <dir>
将软件包安装到<dir>中。默认情况下,这不会替换<dir>中的现有文件/文件夹。
使用--upgrade将<dir>中的现有软件包替换为新版本。


如果目标开关不可用,请升级点子:

在Linux或OS X上:

pip install -U pip

在Windows上(这可以解决问题):

python -m pip install -U pip

8
@DanH跑pip install --upgrade pip
r3m0t 2014年

16
这是真正的答案,只是在接受的答案之后添加了很多选项。
bukzor 2014年

5
--install-option="--prefix=$PREFIX_PATH"@Ian Bicking提到的--target=$PATH选项与选项之间有什么区别?
Hibou57

6
target是一个pip选项,您输入的所有内容install-option都会传递给setup.py install command。基本上target是自定义站点包的位置。
Janusz Skonieczny 2014年

10
使用--target可能会导致部分安装,因为它不会在指定的前缀中安装任何包含脚本/数据文件的文件。这似乎是通过--prefix--install-option是唯一正确的办法有完全控制所采用的设备前缀。
肯尼斯·哈斯特2015年

73

代替--target选项或--install-options选项,我发现以下方法很好用(来自有关此问题的错误讨论,网址https://github.com/pypa/pip/issues/446):

PYTHONUSERBASE=/path/to/install/to pip install --user

(或者PYTHONUSERBASE在运行命令之前使用,在您的环境中设置目录export PYTHONUSERBASE=/path/to/install/to

它使用了非常有用的--user选项,但告诉它使binlibshare你会在一个自定义的前缀期待,而不是和其他目录$HOME/.local

然后,你可以到你添加这个PATHPYTHONPATH你将一个正常的安装目录和其他变量。

请注意,如果依赖于此的任何软件包都需要在目录中安装较新的版本,则您可能还需要指定--upgrade--ignore-installed选项PYTHONUSERBASE,以覆盖系统提供的版本。

一个完整的例子:

PYTHONUSERBASE=/opt/mysterypackage-1.0/python-deps pip install --user --upgrade numpy scipy

..将最新版本的scipy并将numpy最新版本安装并打包到一个目录中,然后可以将其包含在目录中PYTHONPATH(对于本示例,在CentOS 6上使用bash和python 2.6):

export PYTHONPATH=/opt/mysterypackage-1.0/python-deps/lib64/python2.6/site-packages:$PYTHONPATH
export PATH=/opt/mysterypackage-1.0/python-deps/bin:$PATH

使用virtualenv仍然是更好,更整洁的解决方案!


4
这适用于在Docker容器上运行的Travis CI,而--install-option =“-prefix = $ PREFIX_PATH”解决方案则不能。
32位

1
Noobie问题,是多么重要的/bin文件夹中创建点子,--user将其创建为做--PREFIX--target没有。
乔纳森

1
如果软件包安装在全局Python中,--ignore-installed则是必需的。
乔治·索维托夫

1
此选项还与--editable本地安装兼容。
mdh

1
此选项非常方便,无需超级用户即可将软件包作为超级用户安装为另一个非root用户su(例如,在容器中可能会出现问题)。
mdh

43

安装Python软件包通常仅包含一些纯Python文件。如果程序包包含数据,脚本和/或可执行文件,则它们将与纯Python文件安装在不同的目录中。

假设您的软件包没有数据/脚本/可执行文件,并且您希望Python文件进入/python/packages/package_name(而不是下面几级的某个子目录)/python/packages使用时--prefix),则可以使用一次命令:

pip install --install-option="--install-purelib=/python/packages" package_name

如果您希望所有(或大多数)包裹都放在那儿,则可以编辑 ~/.pip/pip.conf以包括:

[install]
install-option=--install-purelib=/python/packages

这样,您就不必忘记必须一次又一次地指定它。

软件包中包含的所有可执行文件/数据/脚本仍将保留其默认位置,除非您指定其他安装选项(--prefix/ --install-data/ --install-scripts等,有关详细信息,请参阅自定义安装选项)。


1
配置文件的一大优点。我个人指定该--prefix目录,因为我在主目录的共享服务器上有一个“本地”目录,easy_install在我移至之前,它已被用作前缀pip。系统$PATH$PYTHONPATH之前已配置。而不是install-option=--install-purelib=/blah有这个较新的target=/blah选项/开关。这也是不错的,但有时你只需要进行更换--prefix,你会与使用setup.pyeasy_install
Tomasz Gandor 2013年



14

只需在@Ian Bicking的答案中添加一点:

--user如果要在远程服务器上将一些Python软件包安装到其主目录中(没有sudo用户权限),则使用该选项指定已安装目录也可以使用。

例如,

pip install --user python-memcached

该命令会将软件包安装到PYTHONPATH中列出的目录之一。


14

使用python3.5和pip 9.0.3测试了这些选项:

pip install --target / myfolder [程序包]

在/ myfolder下安装所有软件包,包括依赖项。不考虑依赖包已在Python中的其他位置安装。您可以从/ myfolder / [package_name]中找到软件包。如果您有多个Python版本,则无需考虑(软件包文件夹名称中没有Python版本)。

pip install --prefix / myfolder [软件包]

检查是否已安装依赖项。将安装包到/myfolder/lib/python3.5/site-packages/[packages]

pip install --root / myfolder [软件包]

检查--prefix之类的依赖项,但安装位置将为/myfolder/usr/local/lib/python3.5/site-packages/[package_name]。

pip install --user [软件包]

会将软件包安装到$ HOME中:/home/[USER]/.local/lib/python3.5/site-packages Python会自动从此.local路径搜索,因此您无需将其放入PYTHONPATH。

=>在大多数情况下,--user是最佳选择。如果由于某种原因无法使用主文件夹,请使用--prefix。


例如,在python 2.7.16下运行,--target(或--prefix)将安装Jinja2-2.10.1.dist-info /,而install --install-option =“-prefix将安装Jinja2-2.10.1-py2 .7.egg-INFO /,这是我其实是想
格雷格·道赫蒂

13

较新的版本pip(8或更高版本)可以直接使用--prefix选项

pip install --prefix=$PREFIX_PATH package_name

在哪里$PREFIX_PATH放置lib,bin和其他顶级文件夹的安装前缀。


10
pip install packageName -t pathOfDirectory

要么

pip install packageName --target pathOfDirectorty

4

补充一下已经很好的建议,因为在没有的写入权限时安装IPython时遇到了问题/usr/local

pip使用distutils进行安装,该线程讨论了依赖sys.prefix设置会导致问题的原因。

我的问题发生在IPython安装尝试在权限被拒绝的情况下写入'/ usr / local / share / man / man1'时。由于安装失败,因此似乎没有在bin目录中写入IPython文件。

使用“ --user”可以将文件写入〜/ .local。在$ PATH中添加〜/ .local / bin意味着我可以从那里使用“ ipython”。

但是,我试图为许多用户安装此程序,并已被授予对该/usr/local/lib/python2.7目录的写权限。我在该目录下创建了一个“ bin”目录,并为distutils设置了指令:

vim ~/.pydistutils.cfg

[install]
install-data=/usr/local/lib/python2.7
install-scripts=/usr/local/lib/python2.7/bin

然后((-I尽管先前失败,仍用于强制安装/.local安装):

pip install -I ipython

然后我添加/usr/local/lib/python2.7/bin$PATH

我以为我可以将其包括在内,以防其他人无法通过sudo访问的计算机上出现类似问题。


2

不幸的是,如果您将brew与python一起使用,则pip / pip3附带的选项非常有限。您没有如上所述的--install-option,--target和--user选项。

关于pip install --user
注意事项酿造的Python禁用了正常的pip install --user。这是由于distutils中的错误,因为Homebrew编写了一个distutils.cfg来设置软件包前缀。可能的解决方法(将可执行脚本放入〜/ Library / Python /./ bin中)是: python -m pip install --user --install-option="--prefix=" <package-name>

您可能会发现此行非常麻烦。我建议使用pyenv进行管理。如果您正在使用

brew upgrade python python3

具有讽刺意味的是,您实际上是在降低点子功能。

(我之所以发布此答案,仅仅是因为我的Mac osx中的pip没有--target选项,并且我花了数小时来修复它)


这个答案带有明确的前缀,并且ignore-installed由于之前的努力,对我python -m pip install --user --install-option="--prefix='/myFunkyApp/lib'" --ignore-installed <package-name>
Jeremy Jones

0

v1.5.6在Python v2.7.3(GNU / Linux)上使用pip 时,option --root允许(显然)指定全局安装前缀,而与特定软件包的选项无关。试试吧,

$ pip install --root=/alternative/prefix/path package_name

0

我建议遵循文档并创建〜/ .pip / pip.conf文件。注意在文档中缺少指定的标头目录,这导致以下错误:

error: install-base or install-platbase supplied, but installation scheme is incomplete

conf文件的全部工作内容是:

[install]
install-base=$HOME
install-purelib=python/lib
install-platlib=python/lib.$PLAT
install-scripts=python/scripts
install-headers=python/include
install-data=python/data

不幸的是我可以安装,但是当尝试卸载pip时,告诉我没有用于卸载过程的软件包。


0

pip install /path/to/package/

现在是可能的。

与使用-e--editable标志的区别在于,-e链接指向软件包的保存位置(即下载文件夹),而不是将其安装到python路径中。

这意味着,如果您将软件包删除/移动到另一个文件夹,则将无法使用它。


这不回答这个问题
Clintm

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.