python - example - DistutilsOptionError: debe suministrar home o prefix/exec-prefix-no ambos
pip install python (8)
Por lo general, he instalado paquetes de Python a través de pip.
Para Google App Engine, necesito instalar paquetes en otro directorio de destino.
He intentado:
instalación de pip -I matraz-restful --target ./lib
pero falla con:
debe suministrar ya sea inicio o prefijo / prefijo exec - no ambos
¿Cómo puedo hacer que esto funcione?
¿Estás usando OS X y Homebrew? La página de Python de Homebrew https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md emite un problema conocido con pip y una solución alternativa.
Trabajó para mi.
Puede hacer que este "prefijo vacío" sea el predeterminado al agregar un archivo ~ / .pydistutils.cfg con los siguientes contenidos:
[install] prefix=
Editar: No use esta opción recomendada de Homebrew, ya que romperá las operaciones normales de pip .
Como se mencionó anteriormente, este es un error conocido con pip & python instalado con homebrew.
Si crea el archivo ~/.pydistutils.cfg
con la instrucción "prefijo vacío", solucionará este problema pero romperá las operaciones de pip normales.
Hasta que se solucione oficialmente este error, una de las opciones sería crear tu propio script bash que manejaría este caso:
#!/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
Esta secuencia de comandos ajusta su comando y:
- acepta los parámetros de nombre y objetivo
- comprueba si esos parámetros están vacíos
- crea el archivo
~/.pydistutils.cfg
con la instrucción "prefijo vacío" en él - ejecuta su comando pip con los parámetros proporcionados
- elimina el archivo
~/.pydistutils.cfg
Este script se puede modificar y adaptar para satisfacer sus necesidades, pero se le ocurre una idea. Y te permite ejecutar tu comando sin frenar el pip. Espero eso ayude :)
Creo que hay una solución más simple a este problema (Homebrew''s Python en macOS) que no romperá sus operaciones de pip normales.
Todo lo que tiene que hacer es crear un archivo setup.cfg
en el directorio raíz de su proyecto, generalmente donde se encuentra el archivo __init__.py
principal o el archivo ejecutable py. Entonces, si la carpeta raíz de su proyecto es: /path/to/my/project/
, cree un archivo setup.cfg
allí y coloque las palabras mágicas dentro:
[install]
prefix=
OK, ahora podrías ejecutar los comandos de pip para esa carpeta:
pip install package -t /path/to/my/project/
Este comando se ejecutará correctamente solo para esa carpeta. Simplemente copie setup.cfg
en cualquier otro proyecto que pueda tener. No es necesario escribir un .pydistutils.cfg
en su directorio personal. Una vez que haya terminado de instalar los módulos, puede eliminar setup.cfg
.
En OSX (mac), asumiendo una carpeta de proyecto llamada / var / myproject
-
cd /var/myproject
- Cree un archivo llamado
setup.cfg
y agregue[install] prefix=
- Ejecute
pip install <packagename> -t .
Otra solución * para los usuarios de Homebrew es simplemente usar un virtualenv
.
Por supuesto, eso puede eliminar la necesidad del directorio de destino de todos modos, pero incluso si no lo hace, he encontrado que el --target
funciona por defecto (como en, sin crear / modificar un archivo de configuración) cuando se está en un entorno virtual.
* Yo digo solución; tal vez es solo otra motivación para usar venvs meticulosamente ...
Si está utilizando virtualenv *, podría ser una buena idea verificar which pip
está usando.
Si ve algo como /usr/local/bin/pip
, ha salido de su entorno. La reactivación de su virtualenv solucionará esto:
VirtualEnv: $ source bin/activate
VirtualFish: $ vf activate [environ]
*: Uso Virtualfish, pero asumo que este consejo es relevante para ambos.
Tengo un problema similar. Utilizo el indicador --system para evitar el error como lo decribo here en otro hilo donde explico el caso específico de mi situación. Publico esto aquí esperando que pueda ayudar a cualquiera que tenga el mismo problema.
--install-option="--prefix=lib"
errores con las otras recomendaciones en torno a --install-option="--prefix=lib"
. Lo único que encontré que funcionó es usar PYTHONUSERBASE
como se describe here .
export PYTHONUSERBASE=lib
pip install -I flask-restful --user
esto no es exactamente lo mismo que --target
, pero en todo caso sirve para mí.