pip installe les packages avec succès, mais les exécutables ne sont pas trouvés à partir de la ligne de commande

113

Je travaille sur mac OS X Yosemite, version 10.10.3.

J'ai installé python2.7 et pip en utilisant macport comme indiqué dans http://johnlaudun.org/20150512-installing-and-setting-pip-with-macports/

Je peux installer avec succès des packages et les importer dans mon environnement python et mes scripts python. Cependant, aucun exécutable associé à un package qui peut être appelé à partir de la ligne de commande dans le terminal n'est trouvé.

Est-ce que quelqu'un sait ce qui pourrait être mauvais? (Plus de détails ci-dessous)

Par exemple lors de l'installation d'un package appelé "rosdep" comme indiqué dans http://wiki.ros.org/jade/Installation/Source

Je peux exécuter: sudo pip install -U rosdep qui s'installe sans erreurs et les fichiers correspondants se trouvent dans/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages

Cependant si j'essaye d'exécuter:, sudo rosdep initcela donne une erreur:"sudo: rosdep: command not found"

Ce n'est pas une erreur spécifique au package. J'obtiens ceci pour n'importe quel paquet installé en utilisant pip sur mon ordinateur. J'ai même essayé d'ajouter

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages

à mon $PATH. Mais les exécutables ne se trouvent pas sur la ligne de commande, même si les packages fonctionnent parfaitement depuis python.

Sanket_Diwale
la source
tout virtualenv impliqué?
JL Peyret
non, aucun virtualenv n'est impliqué.
Sanket_Diwale
lorsque vous sudo, vous passez au $ PATH de l'utilisateur root, assurez-vous simplement que son PATH est mis à jour, pas votre PATH
Anthony Perot

Réponses:

48

vérifiez votre $ PATH

tox a un mode ligne de commande:

audrey:tests jluc$ pip list | grep tox
tox (2.3.1)

où est-ce?

(modifier: les 2.7trucs n'ont pas beaucoup d'importance ici, les sous de tout 3.xet pip se comportent à peu près de la même manière)

audrey:tests jluc$ which tox
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/tox

et que contient mon $ PATH?

audrey:tests jluc$ echo $PATH
/opt/chefdk/bin:/opt/chefdk/embedded/bin:/opt/local/bin:..../opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin...

Remarquez le /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin ? C'est ce qui permet de trouver mes trucs installés par pip

Maintenant, pour voir où les choses viennent de Python, essayez de faire ceci (remplacez rosdep-le tox).

$python
>>> import tox
>>> tox.__file__

qui imprime:

'/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/tox/__init__.pyc'

Maintenant, cd dans le répertoire juste au-dessus libdans ce qui précède. Voyez-vous un répertoire bin ? Voyez-vous rosdepdans ce bac? Si c'est le cas, essayez d'ajouter le binà votre $ PATH.

audrey:2.7 jluc$ cd /opt/local/Library/Frameworks/Python.framework/Versions/2.7
audrey:2.7 jluc$ ls -1

production:

Headers
Python
Resources
bin
include
lib
man
share
JL Peyret
la source
Merci JL pour la réponse, mais c'est principalement mon problème. Pour mon exemple d'application rosdep, lorsque je fais ce que vous avez fait, voici la sortie obtenue: pip list | grep rosdep rosdep (0.11.4) qui rosdep (pas de sortie), la ligne de commande ne renvoie rien
Sanket_Diwale
1
qui ne revient pas rosdepest cohérent avec votre problème. mon point est que vous devez trouver où le rosdepest installé et à quoi ressemble $ PATH.
JL Peyret
Merci, j'ai également installé mes binaires dans /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin. Ajouté cela au PATH et maintenant son fonctionnement. Merci, j'avais du mal à localiser les binaires car cela ne fournissait aucune sortie.
Sanket_Diwale
export PATH = / opt / local / Library / Frameworks / Python.framework / Versions / 2.7 / bin: $ PATH manquait sur mes chemins et a fait l'affaire pour moi sur OSX
Caio Iglesias
1
Si vous ne trouvez pas le programme avec which(s'il ne se trouve pas encore dans votre chemin), vous pouvez également essayer de trouver le binaire en utilisant mlocateLinux ou mdfindMacOS.
jackcogdill
54

Sur macOS avec l'installation python par défaut, vous devez ajouter /Users/<you>/Library/Python/2.7/bin/à votre $ PATH.

Ajoutez ceci à votre .bash_profile:

export PATH="/Users/<you>/Library/Python/2.7/bin:$PATH"

C'est là que pip installe les exécutables.

Astuce: pour une version python autre que celle par défaut, which pythonrecherchez l'emplacement de votre installation python et remplacez cette partie dans le chemin ci-dessus. (Merci pour l'indice Sanket_Diwale)

joh-mue
la source
8
L'endroit où pip installe dépend de la façon dont vous avez installé python, MacOS a plusieurs façons d'installer python, comme macports, homebrew et système par défaut. Selon la version de python utilisée, vous aurez différents emplacements pour pip. Un moyen simple de savoir où se trouvent pip et python serait d'utiliser "which python" dans le terminal, puis d'ajouter l'emplacement approprié au $ PATH.
Sanket_Diwale
Pour macOS 10.14.3, installer Python 3.6 à partir de python.org, which python3m'a finalement conduit (via un lien) à /Library/Frameworks/Python.framework/Versions/3.6/bin/.
phoenix
42

Si vous installez en utilisant --user(par exemple pip3.6 install --user tmuxp), il est possible d'obtenir le répertoire d'installation utilisateur spécifique à la plate-forme à partir de Python lui-même en utilisant le sitemodule . Par exemple, sur macOS:

$ python2.7 -m site --user-base
/Users/alexp/Library/Python/2.7

En ajoutant /binà cela, nous avons maintenant le chemin où les exécutables du package seront installés. Nous pouvons remplir dynamiquement le PATH dans le fichier rc de votre shell en fonction de la sortie; J'utilise bash, mais avec un peu de chance, c'est portable:

# Add Python bin directories to path
python3.6 -m site &> /dev/null && PATH="$PATH:`python3.6 -m site --user-base`/bin"
python2.7 -m site &> /dev/null && PATH="$PATH:`python2.7 -m site --user-base`/bin"

J'utilise les versions précises de Python pour réduire le risque que les exécutables «disparaissent» lorsque Python met à jour une version mineure, par exemple de la version 3.5 à la version 3.6. Ils disparaîtront car, comme on peut le voir ci-dessus, le chemin d'installation de l'utilisateur peut inclure la version Python. Ainsi, alors que python3pourrait pointer vers 3,5 ou 3,6, python3.6il pointera toujours vers 3,6. Cela doit être gardé à l'esprit lors de l'installation de paquets supplémentaires, par exemple lors de l'utilisation de pip3.6over pip3.

Si l'idée de la disparition des packages ne vous dérange pas, vous pouvez utiliser python2et à la python3place:

# Add Python bin directories to path
# Note: When Python is upgraded, packages may need to be re-installed
#       or Python versions managed.
python3 -m site &> /dev/null && PATH="$PATH:`python3 -m site --user-base`/bin"
python2 -m site &> /dev/null && PATH="$PATH:`python2 -m site --user-base`/bin"
Alex Palmer
la source
25

Je sais que la question pose sur macOS, mais voici une solution pour les utilisateurs de Linux qui arrivent ici via Google.

J'avais le problème décrit dans cette question, après avoir installé le package pdfx via pip.

Quand je l'ai couru cependant, rien ...

pip list | grep pdfx
pdfx (1.3.0)

Encore:

which pdfx
pdfx not found

Le problème sous Linux est que les pip install ...scripts sont introduits ~/.local/binet ce n'est pas sur le Debian / Ubuntu par défaut $PATH.

Voici un problème GitHub plus détaillé: https://github.com/pypa/pip/issues/3813

Pour réparer, ajoutez simplement ~/.local/binà votre $PATH, par exemple en ajoutant la ligne suivante à votre .bashrcfichier:

export PATH="$HOME/.local/bin:$PATH"

Après cela, redémarrez votre shell et les choses devraient fonctionner comme prévu.

James Hibbard
la source
2
Au lieu de redémarrer votre shell, vous pouvez source ~/.bashrcrecharger la .bashrcconfiguration
Whiteclaws
1
Génial. J'obtenais "commande tox not found". Après la mise à jour de PATH ça marche
GabrielBB
8

Solution

Basé sur d'autres réponses, pour linuxet macvous pouvez exécuter ce qui suit:

echo "export PATH=\"`python3 -m site --user-base`/bin:$PATH\"" >> ~/.bashrc
source ~/.bashrc

au lieu de python3vous pouvez utiliser un autre lien vers la version python: python, python2.7, python3.6, python3.9, etc.

Explication

Afin de savoir où les packages utilisateur sont installés dans le système d'exploitation actuel (win, mac, linux), nous exécutons:

python3 -m site --user-base

Nous savons que les scripts vont dans le bin/dossier où les packages sont installés.

Nous concaténons donc les chemins:

echo `python3 -m site --user-base`/bin

Ensuite, nous exportons cela vers une variable d'environnement.

export PATH=\"`python3 -m site --user-base`/bin:$PATH\""

Enfin, afin d'éviter de répéter la commande d'exportation, nous l'ajoutons à notre .bashrcfichier et nous sourceexécutons les nouvelles modifications, en nous donnant la solution suggérée mentionnée au début.

Willemoes
la source
@Benjamints a ajouté une explication, j'espère que cela aidera, bonne chance!
Willemoes
3

Sous Windows, vous devez ajouter le chemin %USERPROFILE%\AppData\Roaming\Python\Scriptsà votre chemin.

Plage de Jared
la source
2

Je suis tombé sur cette question parce que j'ai créé, construit et publié avec succès un package PyPI, mais je n'ai pas pu l'exécuter après l'installation. La $PATHvariable a été correctement définie.

Dans mon cas, le problème était que je n'avais pas défini le entry_pointdans le setup.pyfichier:

entry_points = {'console_scripts':

['YOUR_CONSOLE_COMMAND=MODULE_NAME.FILE_NAME:FUNCTION_NAME'],},
Thomas Johannesmeyer
la source
2

En plus d'ajouter le binrépertoire de python à la $PATHvariable, j'ai également dû changer le propriétaire de ce répertoire, pour le faire fonctionner. Je ne sais pas pourquoi je n'étais pas déjà le propriétaire.

chown -R ~/Library/Python/
d4Rk
la source
1

Lorsque vous installez Python ou Python3 à l'aide du programme d'installation MacOS (téléchargé à partir du site Web Python), il ajoute un exporter à votre ~/.profilescript. Tout ce que vous avez à faire est juste sourcecela. Le redémarrage de tous les terminaux devrait également faire l'affaire.

AVERTISSEMENT - Je pense qu'il est préférable d'utiliser simplement pip3 avec Python3 - pour des avantages futurs.

Si vous avez déjà installé Python3, les étapes suivantes fonctionnent pour moi sur macOS Mojave:

  1. Installez ansible d'abord en utilisant sudo-sudo -H pip3 install ansible

  2. vous créez un lien symbolique vers le binchemin de Python

sudo ln -s /Library/Frameworks/Python.framework/Versions/Current/bin /Library/Frameworks/Python.framework/current_python_bin

et agrafez-le pour .profile

export PATH=$PATH:/Library/Frameworks/Python.framework/current_python_bin

  1. exécutez source ~/.profileet redémarrez tous les shells de terminaux.

  2. Type ansible --version

ha9u63ar
la source
+1 pour votre déclaration d'ouverture (relancez simplement .profile ou déconnectez-vous et reconnectez-vous) après avoir utilisé pip3 pour installer un package python cmdline.
automorphe