web-dev-qa-db-fra.com

DistutilsOptionError: doit fournir le préfixe home ou le préfixe / exec-prefix - pas les deux

J'ai généralement été installé python paquets via pip.

Pour Google App Engine, je dois installer les packages dans un autre répertoire cible.

J'ai essayé:

pip installer -I flask-reposful --target ./lib

mais cela échoue avec:

doit fournir soit la maison ou le préfixe/exec-prefix - pas les deux

Comment puis-je le faire fonctionner?

128
Arkind

Utilisez-vous OS X et Homebrew? Le Homebrew python page https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md appelle un problème connu. avec pip et un travail autour.

Travaillé pour moi.

Vous pouvez définir ce "préfixe vide" comme valeur par défaut en ajoutant un fichier ~/.pydistutils.cfg avec le contenu suivant:

[install]
prefix=

Edit: N'utilisez pas cette option recommandée par Homebrew, elle interrompra les opérations de pip normales.

272
ayvazj

Je crois qu’il existe une solution plus simple à ce problème (Python sur MacOS d’Homebrew)] qui ne casse pas vos opérations de pip normales.

Tout ce que vous avez à faire est de créer un setup.cfg fichier dans le répertoire racine de votre projet, généralement là où se trouve votre principal __init__.py ou le fichier py exécutable est. Donc, si le dossier racine de votre projet est: /path/to/my/project/, créer un setup.cfg file ici et met les mots magiques à l'intérieur:

[install]
prefix=  

OK, vous devriez maintenant pouvoir exécuter les commandes de pip pour ce dossier:

pip install package -t /path/to/my/project/  

Cette commande s'exécutera normalement pour ce dossier uniquement. Il suffit de copier setup.cfg à tout autre projet que vous pourriez avoir. Pas besoin d'écrire un .pydistutils.cfg sur votre répertoire personnel.

Une fois que vous avez terminé l’installation des modules, vous pouvez le supprimersetup.cfg.

132
AndreG

Sur OSX (mac), en supposant un dossier de projet appelé/var/myproject

  1. cd /var/myproject
  2. Créez un fichier nommé setup.cfg et ajouter [install] prefix=
  3. Courir pip install <packagename> -t .
21
Jerome Anthony

Une autre solution * pour les utilisateurs Homebrew consiste simplement à utiliser un virtualenv.

Bien sûr, cela peut supprime de toute façon la nécessité du répertoire cible - mais même si ce n'est pas le cas, j'ai trouvé --target fonctionne par défaut (comme dans, sans créer/modifier un fichier de configuration) dans un environnement virtuel.


* Je dis solution; peut-être est-ce juste une autre motivation pour utiliser méticuleusement les apparences ...

12
OJFord

Je frappe des erreurs avec les autres recommandations autour de --install-option="--prefix=lib". La seule chose que j'ai trouvée qui a fonctionné utilise PYTHONUSERBASE comme décrit ici .

export PYTHONUSERBASE=lib
pip install -I flask-restful --user

ce n'est pas exactement la même chose que --target, mais cela me convient en tout cas.

3
Imran Rashid

Comme mentionné précédemment, il s'agit d'un bogue connu de pip & python installé avec homebrew.

Si vous créez ~/.pydistutils.cfg fichier avec instruction "préfixe vide", il résoudra ce problème mais interrompra les opérations pip normales.

Jusqu'à ce que ce bogue soit officiellement résolu, l'une des options serait de créer votre propre script bash qui gèrerait ce cas:

 #!/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

Ce script enveloppe votre commande et:

  1. accepte les paramètres nom et cible
  2. vérifie si ces paramètres sont vides
  3. crée ~/.pydistutils.cfg fichier contenant l'instruction "préfixe vide"
  4. exécute votre commande pip avec les paramètres fournis
  5. supprime ~/.pydistutils.cfg fichier

Ce script peut être modifié et adapté pour répondre à vos besoins, mais vous en avez une idée. Et cela vous permet d'exécuter votre commande sans pépin de freinage. J'espère que ça aide :)

1
vs.

Si vous utilisez virtualenv *, il peut être judicieux de vérifier deux fois which pip vous utilisez.

Si vous voyez quelque chose comme /usr/local/bin/pip vous êtes sorti de votre environnement. Réactiver votre virtualenv corrigera ceci:

VirtualEnv: $ source bin/activate

VirtualFish: $ vf activate [environ]

*: J'utilise virtualfish, mais je suppose que cette astuce est pertinente pour les deux.

1
Graham P Heath