Installer un package Python dans un répertoire différent en utilisant pip?

435

Je sais que la réponse évidente est d'utiliser virtualenv et virtualenvwrapper, mais pour diverses raisons, je ne peux / ne veux pas le faire.

Alors, comment puis-je modifier la commande

pip install package_name

faire pipinstaller le package ailleurs que par défaut site-packages?

Monika Sulik
la source
2
Maintenant, question numéro deux: lorsque vous installez déjà dans un répertoire personnalisé, comment faire pour pipNE PAS essayer de supprimer la version antérieure d'un répertoire non personnalisé. Par exemple - un système à l'échelle du système, où vous n'avez aucune autorisation d'écriture. Jusqu'à présent, je n'ai réussi que easy_install...
Tomasz Gandor
2
@TomaszGandor Je pense que l'utilisation de l' --ignore-installedoption devrait empêcher pip d'essayer de désinstaller les packages déjà installés.
Piotr Dobrogost
désolé, je suis nouveau avec pip, mais votre question est-elle la même que celle de demander "comment installer pi sur une autre version de python"? J'ai python 3.4 et 3.5 mais je veux que mes installations pip passent en python 3.5.
Charlie Parker
@Charlie Nope, question différente. Je ne connais pas assez votre installation / vos intentions, mais généralement j'utiliserais probablement virtualenvwrapper et créerais un environnement virtuel avec quelque chose commemkvirtualenv --python=/usr/bin/python3.5 env_name
Monika Sulik

Réponses:

335

Utilisation:

pip install --install-option="--prefix=$PREFIX_PATH" package_name

Vous pouvez également utiliser --ignore-installedpour forcer la réinstallation de toutes les dépendances à l'aide de ce nouveau préfixe. Vous pouvez utiliser --install-optionplusieurs fois pour ajouter l'une des options que vous pouvez utiliser avec python setup.py install( --prefixc'est probablement ce que vous voulez, mais il y a beaucoup plus d'options que vous pouvez utiliser).

Ian Bicking
la source
5
si vous faites cela, existe-t-il un moyen pip freezede voir le répertoire alternatif?
Russ
7
pip freeze regarde sur le chemin, donc si vous quelque chose comme PYTHONPATH=$PREFIX_PATH/lib/python2.6/site-packages pip freezeça devrait les voir.
Ian Bicking
4
L'utilisation --prefix=$PREFIX_PATHne semble pas permettre d'avoir le contrôle total du répertoire d'installation car il y a un suffixe spécifique au système qui y est ajouté ( \Lib\site-packagessous Windows par exemple). Existe-t-il un moyen de spécifier un répertoire spécifique?
Piotr Dobrogost
1
@Piotr: oui il y a voir ma réponse. Utiliser '--prefix' est un peu grossier, mais fonctionne bien si vous voulez que votre pur python passe sous /usr/lib/pythonX.Y/site-packages au lieu de /usr/local/lib/pythonX.Y/site- paquets.
Anthon
80
Pas une mauvaise réponse il y a 4 ans, mais l'option --target existe maintenant.
Tritium21
546

Le commutateur --target est la chose que vous recherchez:

pip install --target=d:\somewhere\other\than\the\default package_name

Mais vous devez toujours ajouter d:\somewhere\other\than\the\defaultà PYTHONPATHpour les utiliser à partir de cet emplacement.

-t, --target <rép>
Installer des packages dans <rép>. Par défaut, cela ne remplacera pas les fichiers / dossiers existants dans <rép>.
Utilisez --upgrade pour remplacer les packages existants dans <rép> par de nouvelles versions.


Mettez à niveau pip si le commutateur cible n'est pas disponible:

Sous Linux ou OS X:

pip install -U pip

Sous Windows (cela fonctionne autour d' un problème ):

python -m pip install -U pip
Janusz Skonieczny
la source
8
@DanH run pip install --upgrade pip!
r3m0t
16
C'est la vraie réponse, c'est juste que l'option a été ajoutée un peu après la réponse acceptée.
bukzor
5
Quelle est la différence entre --install-option="--prefix=$PREFIX_PATH"mentionnée par @Ian Bicking et l' --target=$PATHoption?
Hibou57
6
targetest une option pip, et tout ce que vous y mettrez install-optionsera transmis au setup.py install command. Fondamentalement, l' targetemplacement des packages de sites personnalisés.
Janusz Skonieczny
10
L'utilisation --targetpeut entraîner une installation partielle, car elle n'installera aucun script / fichier de données inclus dans le préfixe spécifié. Il semble que passer --prefixavec --install-optionsoit le seul moyen approprié d'avoir un contrôle total sur le préfixe des installations utilisées.
Kenneth Hoste
74

Au lieu de l' --targetoption ou de l' --install-optionsoption, j'ai trouvé que ce qui suit fonctionne bien (d'après la discussion sur un bug concernant cette chose à https://github.com/pypa/pip/issues/446 ):

PYTHONUSERBASE=/path/to/install/to pip install --user

(Ou définissez le PYTHONUSERBASErépertoire dans votre environnement avant d'exécuter la commande, en utilisant export PYTHONUSERBASE=/path/to/install/to)

Celui - ci utilise la très utile --useroption , mais dit pour faire les bin, lib, shareet d' autres répertoires que vous attendez dans un préfixe personnalisé plutôt que $HOME/.local.

Ensuite , vous pouvez ajouter à votre PATH, PYTHONPATHet d' autres variables comme vous le feriez dans un répertoire d'installation normale.

Notez que vous devrez peut-être également spécifier les options --upgradeet --ignore-installedsi des packages dont cela dépend nécessitent l'installation de versions plus récentes dans le PYTHONUSERBASErépertoire, pour remplacer les versions fournies par le système.

Un exemple complet:

PYTHONUSERBASE=/opt/mysterypackage-1.0/python-deps pip install --user --upgrade numpy scipy

..pour installer les versions les plus récentes scipyet numpypackage dans un répertoire que vous pouvez ensuite inclure dans votre PYTHONPATHcomme ça (en utilisant bash et pour python 2.6 sur CentOS 6 pour cet exemple):

export PYTHONPATH=/opt/mysterypackage-1.0/python-deps/lib64/python2.6/site-packages:$PYTHONPATH
export PATH=/opt/mysterypackage-1.0/python-deps/bin:$PATH

Utiliser virtualenv est toujours une solution meilleure et plus soignée!

David Gardner
la source
4
Cela a fonctionné avec Travis CI fonctionnant sur des conteneurs Docker, contrairement à la solution --install-option = "- prefix = $ PREFIX_PATH".
32bits
1
La question de Noobie, à quel point le /bindossier pip est important , le --usercrée comme il le fait --PREFIXalors --targetque non.
Jonathan
1
Si le package est installé dans Python global, --ignore-installedest nécessaire.
George Sovetov
1
Cette option est également compatible avec --editableles installations locales.
mdh
1
Cette option est pratique pour installer des packages en tant que superutilisateur pour un autre utilisateur non root sans avoir à sucontourner (ce qui peut être problématique dans les conteneurs, par exemple).
mdh
43

L'installation d'un package Python inclut souvent uniquement des fichiers Python purs. Si le package comprend des données, des scripts et / ou des exécutables, ceux-ci sont installés dans des répertoires différents des fichiers Python purs.

En supposant que votre package ne contient pas de données / scripts / exécutables, et que vous souhaitez que vos fichiers Python entrent /python/packages/package_name(et pas un sous-répertoire quelques niveaux ci-dessous /python/packagescomme lors de l'utilisation --prefix), vous pouvez utiliser la commande unique:

pip install --install-option="--install-purelib=/python/packages" package_name

Si vous souhaitez que tous (ou la plupart) de vos packages y aillent, vous pouvez modifier votre ~/.pip/pip.confpour inclure:

[install]
install-option=--install-purelib=/python/packages

De cette façon, vous ne pouvez pas oublier d'avoir à le spécifier encore et encore.

Tous les fichiers exécutables / données / scripts inclus dans le package iront toujours à leur emplacement par défaut, sauf si vous spécifiez des options d'installation supplémentaires ( --prefix/ --install-data/ --install-scripts, etc., pour plus de détails, consultez les options d' installation personnalisées ).

Anthon
la source
1
Un gros plus pour le fichier de configuration. Personnellement, je spécifie le --prefixlà - bas, car j'ai un répertoire "local" sur un serveur partagé dans le répertoire personnel, et il a été utilisé comme préfixe easy_installavant de passer à pip. Système $PATHet $PYTHONPATHont été configurés auparavant. Au lieu de cela, install-option=--install-purelib=/blahil y a cette target=/blahoption / commutateur plus récent . C'est aussi bien, mais parfois vous avez juste besoin d'un remplacement pour --prefix, que vous utiliseriez avec setup.pyou easy_install.
Tomasz Gandor
30

Pour installer une bibliothèque exactement où je le voulais, j'ai navigué jusqu'à l'emplacement où je voulais le répertoire avec le terminal puis utilisé

pip install mylibraryName -t . 

la logique dont j'ai tiré cette page: https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/download


la source
11
-test un raccourci pour--target
Jonathan
C'était la seule solution qui a fonctionné pour moi. (Windows 7)
Coliban
18

Personne ne semble avoir mentionné l'option -t mais la plus simple:

pip install -t <direct directory> <package>
Erwan
la source
8
L' -toption est la version courte de l' --targetoption qui a été décrite dans une autre réponse ( stackoverflow.com/a/19404371/594053 ) :)
MattiSG
14

Ajoutez simplement un point à la réponse de @Ian Bicking:

En utilisant le --user option pour spécifier le répertoire installé fonctionne également si l'on veut installer un paquet Python dans son répertoire personnel (sans droit d'utilisateur sudo) sur le serveur distant.

Par exemple,

pip install --user python-memcached

La commande installera le package dans l'un des répertoires répertoriés dans votre PYTHONPATH.

Bonne volonté
la source
14

Testé ces options avec python3.5 et pip 9.0.3:

pip install --target / myfolder [packages]

Installe TOUS les packages, y compris les dépendances sous / mon dossier. Ne prend pas en compte le fait que les packages dépendants sont déjà installés ailleurs dans Python. Vous trouverez les packages dans / myfolder / [package_name]. Si vous avez plusieurs versions de Python, cela ne prend pas cela en compte (pas de version Python dans le nom du dossier du package).

pip install --prefix / myfolder [packages]

Les vérifications sont des dépendances déjà installées. Installer les packages dans /myfolder/lib/python3.5/site-packages/[packages]

pip install --root / myfolder [packages]

Vérifie les dépendances comme --prefix mais l'emplacement d'installation sera /myfolder/usr/local/lib/python3.5/site-packages/[package_name].

pip install --user [packages]

Installe les packages dans $ HOME: /home/[USER[/.local/lib/python3.5/site-packages Python recherche automatiquement à partir de ce chemin d'accès.

=> Dans la plupart des cas, --user est la meilleure option à utiliser. Dans le cas où le dossier de départ ne peut pas être utilisé pour une raison quelconque, alors --prefix.

Mikko
la source
Sous python 2.7.16, --target (ou --prefix) installe Jinja2-2.10.1.dist-info / par exemple, alors que install --install-option = "- prefix installe Jinja2-2.10.1-py2 .7.egg-info /, ce que je voulais vraiment
Greg Dougherty
13

Les versions plus récentes de pip(8 ou ultérieures) peuvent utiliser directement l' --prefixoption :

pip install --prefix=$PREFIX_PATH package_name

$PREFIX_PATHest le préfixe d'installation où sont placés lib, bin et autres dossiers de niveau supérieur.

Mike T
la source
10
pip install packageName -t pathOfDirectory

ou

pip install packageName --target pathOfDirectorty
kundan kaushik
la source
4

Pour ajouter au déjà bon conseil, car j'ai eu un problème d'installation d' IPython alors que je n'avais pas les autorisations d'écriture sur /usr/local.

pip utilise distutils pour effectuer son installation et ce fil de discussion explique comment cela peut provoquer un problème car il repose sur le sys.prefixparamètre.

Mon problème s'est produit lorsque l'installation IPython a tenté d'écrire dans «/ usr / local / share / man / man1» avec l' autorisation refusée . Comme l'installation a échoué, il ne semble pas écrire les fichiers IPython dans le répertoire bin.

L'utilisation de "--user" a fonctionné et les fichiers ont été écrits dans ~ / .local. L'ajout de ~ / .local / bin au $ PATH signifiait que je pouvais utiliser "ipython" à partir de là.

Cependant, j'essaie d'installer cela pour un certain nombre d'utilisateurs et j'ai reçu une autorisation d'écriture sur le /usr/local/lib/python2.7répertoire. J'ai créé un répertoire "bin" en dessous et défini des directives pour distutils:

vim ~/.pydistutils.cfg

[install]
install-data=/usr/local/lib/python2.7
install-scripts=/usr/local/lib/python2.7/bin

puis ( -Iest utilisé pour forcer l'installation malgré les échecs précédents / installation .local):

pip install -I ipython

Puis j'ai ajouté /usr/local/lib/python2.7/binà $PATH.

J'ai pensé l'inclure au cas où quelqu'un d'autre aurait des problèmes similaires sur une machine à laquelle il n'a pas accès à sudo.

Stuart Brock
la source
2

Si vous utilisez brew avec python, malheureusement, pip / pip3 est livré avec des options très limitées. Vous n'avez pas les options --install-option, --target, --user comme mentionné ci-dessus.

Remarque sur l'installation de pip --user
L' installation normale de pip --user est désactivée pour Python brassé. Cela est dû à un bogue dans distutils, car Homebrew écrit un distutils.cfg qui définit le préfixe du package. Une solution de contournement possible (qui place les scripts exécutables dans ~ / Library / Python /./ bin) est: python -m pip install --user --install-option="--prefix=" <package-name>

Vous pourriez trouver cette ligne très encombrante. Je suggère d'utiliser pyenv pour la gestion. Si vous utilisez

brew upgrade python python3

Ironiquement, vous êtes en train de rétrograder la fonctionnalité pip.

(Je poste cette réponse, simplement parce que pip dans mon mac osx n'a pas l'option --target, et j'ai passé des heures à le réparer)

anonyme
la source
Cette réponse avec un préfixe explicite, et en ignore-installedraison des efforts précédents, a fonctionné pour moi:python -m pip install --user --install-option="--prefix='/myFunkyApp/lib'" --ignore-installed <package-name>
Jeremy Jones
0

Avec pip v1.5.6sur Python v2.7.3(GNU / Linux), l'option --rootpermet de spécifier un préfixe d'installation global, (apparemment) indépendamment des options spécifiques du paquet. Essayez fi,

$ pip install --root=/alternative/prefix/path package_name
sphakka
la source
0

Je suggère de suivre la documentation et de créer le fichier ~ / .pip / pip.conf. Notez dans la documentation qu'il manque le répertoire d'en-tête spécifié, ce qui conduit à l'erreur suivante:

error: install-base or install-platbase supplied, but installation scheme is incomplete

Le contenu de travail complet du fichier conf est:

[install]
install-base=$HOME
install-purelib=python/lib
install-platlib=python/lib.$PLAT
install-scripts=python/scripts
install-headers=python/include
install-data=python/data

Malheureusement, je peux installer, mais lorsque j'essaie de désinstaller pip me dit qu'il n'y a pas un tel package pour le processus de désinstallation .... donc quelque chose ne va pas mais le package va à son emplacement prédéfini.

kensai
la source
0

pip install /path/to/package/

est désormais possible.

La différence avec cela et l'utilisation de l' indicateur -eou --editableest que les -eliens vers l'emplacement où le package est enregistré (c'est-à-dire votre dossier de téléchargements), plutôt que de l'installer dans votre chemin python.

Cela signifie que si vous supprimez / déplacez le package vers un autre dossier, vous ne pourrez pas l'utiliser.

AH
la source
cela ne répond pas à la question
Clintm