web-dev-qa-db-fra.com

Combinez --user avec --prefix error avec setup.py install

J'essayais d'installer Python empaquette un système auquel j'ai récemment accédé. J'essayais de tirer parti du relativement nouveau --- de Python par répertoire de site-packages utilisateur , et le nouvelle option --user. (L'option est actuellement non documentée , mais elle existe pour Python 2.6+; vous pouvez voir l'aide en exécutant python setup.py install --help.)

Quand j'ai essayé de courir

python setup.py install --user

sur n'importe quel package que j'ai téléchargé, j'ai toujours eu l'erreur suivante:

error: can't combine user with with prefix/exec_prefix/home or install_(plat)base

L'erreur était extrêmement troublante car, comme vous pouvez le voir, je ne fournissais pas le --prefix, --exec-prefix, --install-base, ou --install-platbase drapeaux comme options de ligne de commande. J'ai perdu beaucoup de temps à essayer de comprendre quel était le problème. Je documente ma réponse ci-dessous, dans l'espoir d'épargner à une autre pauvre âme quelques heures de rasage de yak .

92
gotgenes

Solution de contournement unique:

pip install --user --install-option="--prefix=" <package_name>

ou

python setup.py install --user --prefix=

Notez qu'il n'y a pas de texte (pas même d'espaces) après le =.

N'oubliez pas le --user drapeau.

Installation de plusieurs packages:

Créer ~/.pydistutils.cfg (ou équivalent pour votre système d'exploitation/plate-forme) avec le contenu suivant:

[install]
prefix=

Notez qu'il n'y a pas de texte (pas même d'espaces) après le =.

Exécutez ensuite le pip install --user ou python setup.py install --user commandes. N'oubliez pas le --user drapeau.

Enfin, supprimez ou renommez ce fichier. Laisser ce fichier présent entraînera des problèmes lors de l'installation de Python packages à l'échelle du système (c'est-à-dire sans --user) en tant qu'utilisateur avec ce ~/.pydistutils.cfg.

La cause de ce problème

Cela semble être un problème avec OpenSUSE et RedHat, ce qui a conduit à n bogue dans virtualenv sur ces plateformes.

L'erreur provient d'un niveau système fichier de configuration distutils (dans mon cas /usr/lib64/python2.6/distutils/distutils.cfg) où était ce

[install]
prefix=/usr/local

Fondamentalement, cela équivaut à toujours exécuter la commande d'installation en tant que install --prefix=/usr/local. Vous devez remplacer cette spécification en utilisant l'une des techniques ci-dessus.

145
gotgenes

Comme cela a été noté dans les commentaires, la réponse acceptée (par @gotgenes, qui, vraisemblablement, a des gènes) peut entraîner des conséquences inattendues.

@rogeleaderr dit: "Notez que garder ce fichier comme celui-ci fera Python penser que/est votre répertoire racine python répertoire de bibliothèque, conduisant à des problèmes confus si vous essayez pour installer d'autres nouveaux packages. "

Plutôt que d'écrire un nouveau fichier de configuration, comme le recommande @gotgenes, une meilleure option consiste à ajouter --prefix= (sans texte à droite du signe égal) en option sur ligne de commande, comme dans

$ python setup.py install --user --prefix=
5
dbliss

Publier pour gagner du temps, car aucune réponse disponible n'a fonctionné pour moi ...

Dans certains environnements, l'utilisation de --target (-t) le commutateur rencontrera toujours la même erreur. Lors de mes tests sur deux versions de Linux, j'ai rencontré le même problème lors de l'utilisation de --prefix= paramètre.

Code:

PYTHONUSERBASE=/tmp/ pip install --user --force-reinstall $PACKAGE

Explication: Ma solution de contournement, qui semble fonctionner dans de nombreux environnements (MacOS, Amazon Linux, Debian) consiste à définir la variable d'environnement PYTHONUSERBASE sur un emplacement temporaire. --force-reinstall est utilisé pour déclencher l'installation locale même lorsque le package est déjà installé.

Cela entraînera la compilation/installation du module (selon le système d'exploitation et Python) en: /tmp/lib/python2.7/site-packages/*

4
EE1213