Quel est le but de «pip install --user…»?


189

De pip install --help:

 --user      Install to the Python user install directory for your platform. Typically ~/.local/, or %APPDATA%\Python on
             Windows. (See the Python documentation for site.USER_BASE for full details.)

La documentation de site.USER_BASE est un trou de ver terrifiant de sujets intéressants * NIX que je ne comprends pas.

Quel est le but de --useren anglais simple? Pourquoi l'installation du paquet ~/.local/importerait-elle? Pourquoi ne pas simplement mettre un exécutable quelque part dans mon $ PATH?


2
vous pouvez import site; print site.USER_SITEimprimer l'emplacement d'installation. Pour moi, j'ai /${HOME}/.local/lib/python${PY_MAJOR}.${PY_MINOR}/site-packages.
Trevor Boyd Smith

1
Sur une machine hôte, /usr/local/lib/pythonX.X/dist-packagesest le répertoire par défaut des packages installés par pip . Mais si un utilisateur souhaite installer des packages spécifiques à l'utilisateur, il peut utiliser $ sudo pip3 --user install some_package. Ce package restera indisponible pour les groupes et autres personnes qui accèdent à cet hôte.
noobninja

Réponses:


223

pip installe par défaut les packages Python dans un répertoire système (tel que /usr/local/lib/python3.4). Cela nécessite un accès root.

--user fait à la place de pip installer les packages dans votre répertoire personnel, ce qui ne nécessite aucun privilège spécial.


1
Merci; ça a du sens. Mais est-ce le but de --users'assurer que l'on n'exécute pas le paquet en tant que root? (J'imagine quelque chose de similaire aux options Wireshark / kismet / burpsuite pour configurer des politiques d'accès de groupe, ce qui ne permet pas à toutes les fonctionnalités du programme de s'exécuter en tant que root. Est-ce sur la bonne voie?) Ou l' --useroption est-elle simplement destinée pour permettre l'installation sans privilèges root? Si tel est le cas, pourquoi je ne l'utilise jamais sudo pip install foo_package? Je n'ai jamais eu besoin d'installer des privilèges root via pip auparavant.
Rob Truxal

12
@Rob Truxal. Je pense que le fait est que le package ne sera pas vu par les autres utilisateurs. Peut-être voulez-vous une version plus ancienne / plus récente d'un package, mais si vous l'installez sur le système, vous allez gâcher vos collègues de travail.
EMI

4
Oh! Le --userparamètre concerne l'isolation de l'utilisateur! Cela fait comme une quantité ridicule de sens. Merci @NDEthos!
Rob Truxal

ok voici une question (noobish): supposons que je me connecte en tant qu'utilisateur foo, puis j'ai exécuté cette commande pip install --user -r requirements.txt .. et tout a été installé très bien. Ensuite, je me suis connecté en tant que barre utilisateur et j'ai exécuté le programme python comme suit: sudo -u foo ./odoo-bin .. va-t-il lire les packages python qui ont été installés pour l'utilisateur foo? ou comment ça marche?
abbood

1
existe-t-il également un moyen de répertorier uniquement les packages installés pour l'utilisateur actuel? c'est à dire quelque chose comme pip freeze --user?
abbood le

24

--users'installe dans site.USER_SITE.

Pour mon cas, c'était le cas /Users/.../Library/Python/2.7/bin. J'ai donc ajouté cela à mon PATH (dans le ~/.bash_profilefichier):

export PATH=$PATH:/Users/.../Library/Python/2.7/bin

15

D'autres réponses mentionnent l' site.USER_SITEendroit où les packages Python sont placés. Si vous recherchez des binaires, ceux-ci entrent {site.USER_BASE}/bin.

Si vous souhaitez ajouter ce répertoire au chemin de recherche de votre shell, utilisez:

export PATH="${PATH}:$(python3 -c 'import site; print(site.USER_BASE)')/bin"

14

Juste un avertissement:

Selon ce problème , --usern'est actuellement pas valide dans un pipenvironnement virtuel, car l'emplacement d'un utilisateur n'a pas vraiment de sens pour un environnement virtuel.

N'utilisez donc pas pip install --user some_pkg dans un environnement virtuel , sinon, l'environnement virtuel pipsera confus. Voir cette réponse pour plus de détails.


11

Le meilleur moyen est d'installer virtualenvet de ne pas exiger la --userconfusion. Vous obtiendrez plus de flexibilité et ne vous soucierez pas de supprimer les différentes versions et projets de Python chaque fois que vous installez un package.

https://virtualenv.pypa.io/en/stable/


8

Sur macOS, la raison de l'utilisation de l' --userindicateur est de s'assurer que nous ne corrompons pas les bibliothèques sur lesquelles le système d'exploitation repose. Une approche conservatrice pour de nombreux utilisateurs de macOS consiste à éviter d'installer ou de mettre à jour pip avec une commande qui nécessite sudo. Ainsi, cela inclut l'installation sur/usr/local/bin ...

Réf: Installation de python pour Neovim ( https://github.com/zchee/deoplete-jedi/wiki/Setting-up-Python-for-Neovim )

Je ne suis pas tout à fait clair pourquoi l'installation dans /usr/local/binest un risque sur un Mac étant donné que le système ne repose que sur des binaires python dans /Library/Frameworks/et /usr/bin. Je soupçonne que c'est parce que, comme indiqué ci-dessus, l'installation dans /usr/local/binnécessite sudoce qui ouvre la porte à une erreur coûteuse avec les bibliothèques système. Ainsi, l'installation dans ~/.local/binest un moyen sûr d'éviter ce risque.

Réf: Utilisation de python sur un Mac ( https://docs.python.org/2/using/mac.html )

Enfin, dans la mesure où il y a un avantage à installer des packages dans le /usr/local/bin, je me demande s'il est logique de changer le propriétaire du répertoire de rootà user? Cela éviterait d'avoir à utiliser sudotout en protégeant contre les modifications dépendant du système. * Est-ce un défaut de sécurité, une relique de la façon dont les systèmes Unix étaient plus souvent utilisés dans le passé (en tant que serveurs)? Ou au minimum, juste une bonne solution pour les utilisateurs de Mac n'hébergeant pas de serveur?

* Remarque: la fonction de protection de l'intégrité du système (SIP) de Mac semble également empêcher l'utilisateur de modifier les bibliothèques dépendant du système.

- E


8

Sans environnements virtuels

pip <command> --user modifie la portée de la commande pip actuelle pour qu'elle fonctionne sur l'emplacement d'installation du package Python local du compte d'utilisateur actuel, plutôt que sur l'emplacement d'installation du package à l'échelle du système, qui est la valeur par défaut.

Cela n'a vraiment d'importance que sur une machine multi-utilisateurs. Tout ce qui est installé à l'emplacement du système sera visible par tous les utilisateurs, donc l'installation à l'emplacement de l'utilisateur gardera l'installation de ce package séparée des autres utilisateurs (ils ne le verront pas et devront l'installer eux-mêmes pour l'utiliser). Comme il peut y avoir des conflits de version, l'installation d'un package avec les dépendances requises par d'autres packages peut poser des problèmes, il est donc préférable de ne pas pousser tous les packages qu'un utilisateur donné utilise vers l'emplacement d'installation du système.

  • S'il s'agit d'une machine mono-utilisateur, il y a peu ou pas de différence d'installation sur l' --useremplacement. Il sera installé dans un dossier différent, qui peut ou non devoir être ajouté au chemin, en fonction du package et de la façon dont il est utilisé (de nombreux packages installent des outils de ligne de commande qui doivent être sur le chemin pour s'exécuter à partir d'un shell) .
  • S'il s'agit d'une machine multi-utilisateurs, il --userest préférable d'utiliser root / sudo ou d'exiger une installation administrateur et d'affecter l'environnement Python de chaque utilisateur, sauf dans les cas de packages généraux que l'administrateur souhaite mettre à disposition de tous les utilisateurs par défaut.
    • Remarque: Selon les commentaires, sur la plupart des installations Unix / Linux, il a été souligné que les installations système devraient utiliser le gestionnaire de paquets général, tel que apt, plutôt que pip.

Avec des environnements virtuels

L' --useroption dans un environnement venv / virtualenv actif s'installera à l'emplacement python de l'utilisateur local (comme sans environnement virtuel).

Les packages sont installés dans l'environnement virtuel par défaut, mais si vous l'utilisez, --usercela le forcera à s'installer en dehors des environnements virtuels, dans le répertoire de script python des utilisateurs (sous Windows, c'est actuellement c:\users\<username>\appdata\roaming\python\python37\scriptspour moi avec Python 3.7).

Cependant, vous ne pourrez pas accéder à une installation système ou utilisateur à partir d'un environnement virtuel (même si vous avez utilisé --userdans un environnement virtuel).

Si vous installez un environnement virtuel avec l' --system-site-packagesargument, vous aurez accès au dossier de script système pour python. Je pense que cela incluait également le dossier de script python de l'utilisateur, mais je ne suis pas sûr. Cependant, cela peut avoir des conséquences inattendues et ce n'est pas la manière prévue d'utiliser les environnements virtuels.


Emplacement du système Python et des dossiers d'installation de l'utilisateur local

Vous pouvez trouver l'emplacement du dossier d'installation utilisateur pour python avec python -m site --user-base. Je trouve des informations contradictoires dans les questions et réponses, la documentation et j'utilise réellement cette commande sur mon PC pour savoir quelles sont les valeurs par défaut, mais elles se trouvent sous le répertoire personnel de l'utilisateur ( ~raccourci dans * nix, et c:\users\<username>généralement pour Windows).


Autres détails

L' --useroption n'est pas valide pour toutes les commandes. Par exemple, pip uninstallil trouvera et désinstallera les packages partout où ils ont été installés (dans le dossier utilisateur, le dossier de l'environnement virtuel, etc.) et l' --useroption n'est pas valide.

Choses installées avec pip install --user seront installés dans un emplacement local qui ne sera visible que par le compte d'utilisateur actuel et ne nécessitera pas d'accès root (sur * nix) ou d'accès administrateur (sous Windows).

L' --useroption modifie toutes les pip commandes qui l'acceptent pour voir / fonctionner sur le dossier d'installation de l'utilisateur, donc si vous l'utilisez, pip list --userelle ne montrera que les packages installés avec pip install --user.


1
Envisageriez-vous de reformuler la première partie? En dehors d'un environnement virtuel Python , il est vraiment préférable d'éviter d' utiliser pip installsans --usertout à fait. Cela installerait les paquets Python dans des endroits qui devraient vraiment être laissés au gestionnaire de paquets du système (par exemple aptdans Debian / Ubuntu). Il vaut mieux ne pas jouer avec ça, cela conduit à tant de problèmes. Si un package Python doit être disponible pour tous les utilisateurs, utilisez le gestionnaire de packages du système d'exploitation, mais ne le faites pas sudo pip install .... Une alternative est sudo pip install --target .... Sous Windows, c'est moins un problème.
sinoroc

D'accord - vous voulez dire la seconde moitié du dernier point dans la section «sans environnements virtuels»? Si non, quelles parties spécifiques? (n'hésitez pas à le modifier directement pour cette mise à jour, je ne suis pas principalement un utilisateur * nix)
LightCC

Je vois, si vous n'utilisez pas Windows, alors c'est beaucoup moins préoccupant car il n'a pas vraiment de gestionnaire de paquets centralisé, à moins que vous ne commenciez à utiliser quelque chose comme nuget . Je vais voir si je viens modifier votre réponse.
sinoroc

@sinoroc J'ai ajouté une note à ce paragraphe. N'hésitez pas à le mettre à jour pour être plus précis, etc., ou à le modifier ailleurs si j'ai une formulation similaire.
LightCC

1

Pourquoi ne pas simplement mettre un exécutable quelque part dans mon $ PATH

~/.local/bin directoryest théoriquement censé être dans votre $PATH.

Selon ces personnes, c'est un bogue de ne pas l'ajouter lors de l' $PATHutilisation systemd.

Cette réponse l' explique plus en détail.

Mais même si votre distribution inclut le ~/.local/binrépertoire dans le$PATH , il peut être sous la forme suivante (à l'intérieur ~/.profile):

if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

ce qui vous obligerait à vous déconnecter et à vous reconnecter , si le répertoire n'existait pas auparavant.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.