Combinez --user avec une erreur --prefix avec setup.py install

103

J'essayais d'installer des packages Python sur un système auquel j'ai récemment eu accès. J'essayais de profiter du répertoire relativement nouveau de Python par site-packages par utilisateur et de la nouvelle option --user. (L'option n'est actuellement pas 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 l'erreur suivante:

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

L'erreur a été extrêmement déconcertant parce que, comme vous pouvez le voir, je ne fournissait pas la --prefix, --exec-prefix, --install-baseou --install-platbasedrapeaux que les 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 .

gotgenes
la source
2
J'ai eu la même erreur en essayant d'installer python 3.6 à partir de la source avec ./configure --prefix=${HOME}tout en ayant "user = 1" dans ~/.pydistutils.cfg. Dans ce cas, j'ai besoin de commenter temporairement "user = 1" afin que le processus d'installation puisse se terminer.
bli
bli a donné un bon indice. Je me demandais d'où venait l'option --user même si je n'avais pas utilisé cette option. pip install --prefix / home / myhomedir. Je n'ai pas le fichier ~ / .pydistutils.cfg, je cherche toujours où l'option --user est définie.
Kemin Zhou
Trouvez la source du problème. Ceci est spécifique à Debian. Après avoir ajouté l'option --system à pip, le problème a disparu.
Kemin Zhou

Réponses:

161

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'espace) après le =.

N'oubliez pas le--user drapeau.

Installation de plusieurs packages:

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

[install]
prefix=

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

Exécutez ensuite les commandes pip install --userou nécessaires python setup.py install --user. N'oubliez pas le --userdrapeau.

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

La cause de ce problème

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

L'erreur provient d'un fichier de configuration distutils au niveau du système (dans mon cas /usr/lib64/python2.6/distutils/distutils.cfg) où il y avait cela

[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.

gotgenes
la source
1
Merci beaucoup. Le préfixe vide a résolu mon problème: pip 1.1 openSuSE 11.4.
guettli
6
Vous pouvez également passer un --prefix = vide à setup.py dans la ligne de commande pour remplacer la valeur dans le distutils.cfg à l'échelle du système
Tuxdude
2
Hou la la! Cela a fonctionné pour moi aussi. J'ai reçu la même erreur en essayant d'installer Powerline. powerline.readthedocs.org/en/latest/installation/…
A-Dubb
4
Après réflexion, cela causera des problèmes MAJEURS. NE gardez PAS ce fichier à portée de main. Consultez Brew Doctor pour plus d'informations (en supposant que vous utilisez l'homebrew sur Mac OS X).
A-Dubb
1
Notez que conserver ce fichier comme celui-ci fera penser à Python que / est votre répertoire racine de la bibliothèque python, ce qui entraînera des problèmes déroutants si vous essayez d'installer d'autres nouveaux packages.
rogueleaderr
6

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 penser à Python que / est votre répertoire racine de la bibliothèque python, ce qui entraînera des problèmes déroutants si vous essayez d'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 tant qu'option sur la ligne de commande , comme dans

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

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

Dans certains environnements, l'utilisation du commutateur --target( -t) provoquera 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 du--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 PYTHONUSERBASEvariable d'environnement sur un emplacement temporaire. --force-reinstallest utilisé pour déclencher l'installation locale même lorsque le package est déjà installé.

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

EE1213
la source
0

Vous pouvez simplement lancer pip install --user ., sans args préfixe requis.

C'est de toute façon mieux car il sera par défaut python3 si votre pip est configuré pour utiliser Python 3. (j'ai oublié d'entrer python3 setup.py et il a installé un package 3-only sous 2.7)

(crédit https://stackoverflow.com/a/1550235/4364036 )

wesinat0r
la source
0

J'ai eu le même problème. Il était caché à l'intérieur du ~/.config/pip/pip.confavec:

[global]
target=/foo/bar

Une telle configuration a été créée par un script tiers à mon insu.

Je suggère de vérifier les fichiers de configuration de pip et de supprimer les target=/foo/baroptions.

monsieur__finley
la source