我通常通过pip安装了python包。
对于Google App Engine,我需要将软件包安装到另一个目标目录。
我试过了:
pip install -I flask-restful --target ./lib
但它失败了:
必须提供home或prefix / exec-prefix - 而不是两者
我怎样才能让它发挥作用?
你在使用OS X和Homebrew吗? Homebrew python页面https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md用pip和一个解决方法调出一个已知问题。
为我工作。
您可以通过添加带有以下内容的〜/ .pydistutils.cfg文件使此“空前缀”成为默认值:
[install] prefix=
编辑:不要使用这个自制的推荐选项,它会破坏正常的点子操作。
我相信这个问题有一个更简单的解决方案(Homebrew的macOS上的Python),它不会破坏你正常的pip操作。
您所要做的就是在项目的根目录下创建一个setup.cfg
文件,通常是您的主要__init__.py
或可执行py文件所在的位置。因此,如果项目的根文件夹是:/path/to/my/project/
,请在其中创建一个setup.cfg
文件并将魔术字放入其中:
[install]
prefix=
好的,现在您应该能够为该文件夹运行pip命令:
pip install package -t /path/to/my/project/
此命令将仅针对该文件夹正常运行。只需将setup.cfg
复制到您可能拥有的任何其他项目中。无需在主目录中写入.pydistutils.cfg
。
完成模块安装后,您可以删除setup.cfg
。
在OSX(mac)上,假设一个名为/ var / myproject的项目文件夹
cd /var/myproject
setup.cfg
的文件并添加
[install]
prefix=
pip install <packagename> -t .
Homebrew用户的另一个解决方案*就是使用virtualenv
。
当然,这可能会消除对目标目录的需求 - 但即使它没有,我发现--target
在虚拟环境中默认工作(如在没有创建/修改配置文件的情况下)。
*我说解决方案;也许这只是精心使用venvs的另一个动机......
我在围绕--install-option="--prefix=lib"
的其他建议中遇到了错误。我发现唯一有效的方法是使用PYTHONUSERBASE
描述的here。
export PYTHONUSERBASE=lib
pip install -I flask-restful --user
这与--target
不完全相同,但无论如何它对我都有用。
正如其他人提到的,这是用自制软件安装的pip和python的已知错误。
如果使用“空前缀”指令创建~/.pydistutils.cfg
文件,它将解决此问题,但它将破坏正常的pip操作。
在此错误被正式解决之前,其中一个选项是创建自己的bash脚本来处理这种情况:
#!/bin/bash
name=''
target=''
while getopts 'n:t:' flag; do
case "${flag}" in
n) name="${OPTARG}" ;;
t) target="${OPTARG}" ;;
esac
done
if [ -z "$target" ];
then
echo "Target parameter must be provided"
exit 1
fi
if [ -z "$name" ];
then
echo "Name parameter must be provided"
exit 1
fi
# current workaround for homebrew bug
file=$HOME'/.pydistutils.cfg'
touch $file
/bin/cat <<EOM >$file
[install]
prefix=
EOM
# end of current workaround for homebrew bug
pip install -I $name --target $target
# current workaround for homebrew bug
rm -rf $file
# end of current workaround for homebrew bug
此脚本包装您的命令并:
~/.pydistutils.cfg
文件~/.pydistutils.cfg
文件这个脚本可以更改和调整,以满足您的需求,但你会明白。它允许您在不制动点的情况下运行命令。希望能帮助到你 :)
如果您正在使用virtualenv *,那么仔细检查您正在使用的which pip
可能是个好主意。
如果你看到像/usr/local/bin/pip
这样的东西,你已经脱离了你的环境。重新激活你的virtualenv将解决这个问题:
VirtualEnv:$ source bin/activate
VirtualFish:$ vf activate [environ]
*:我使用virtualfish,但我认为这个提示与两者都相关。
我有一个类似的问题。我使用--system标志来避免错误,因为我在其他线程上描述了here,在那里我解释了我的具体情况。我发布这里期待这可以帮助任何人面临同样的问题。