google example engine auth app python google-app-engine install pip distutils

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:

  1. acepta los parámetros de nombre y objetivo
  2. comprueba si esos parámetros están vacíos
  3. crea el archivo ~/.pydistutils.cfg con la instrucción "prefijo vacío" en él
  4. ejecuta su comando pip con los parámetros proporcionados
  5. 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

  1. cd /var/myproject
  2. Cree un archivo llamado setup.cfg y agregue [install] prefix=
  3. 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í.