pip installa i pacchetti correttamente, ma gli eseguibili non vengono trovati dalla riga di comando


110

Sto lavorando su mac OS X Yosemite, versione 10.10.3.

Ho installato python2.7 e pip usando macport come fatto in http://johnlaudun.org/20150512-installing-and-setting-pip-with-macports/

Posso installare con successo i pacchetti e importarli nel mio ambiente Python e negli script Python. Tuttavia, nessun eseguibile associato a un pacchetto che può essere chiamato dalla riga di comando nel terminale non viene trovato.

Qualcuno sa cosa potrebbe esserci di sbagliato? (Maggiori dettagli di seguito)

Ad esempio durante l'installazione di un pacchetto chiamato "rosdep" come indicato in http://wiki.ros.org/jade/Installation/Source

Posso eseguire: sudo pip install -U rosdep che si installa senza errori e i file corrispondenti si trovano in/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages

Tuttavia, se provo a eseguire sudo rosdep init:, viene visualizzato un errore:"sudo: rosdep: command not found"

Questo non è un errore specifico del pacchetto. Lo ottengo per qualsiasi pacchetto installato utilizzando pip sul mio computer. Ho anche provato ad aggiungere

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

al mio $PATH. Ma gli eseguibili non si trovano sulla riga di comando, anche se i pacchetti funzionano perfettamente da Python.


qualsiasi virtualenv coinvolto?
JL Peyret

no, nessun virtualenv è coinvolto.
Sanket_Diwale

quando sudo, passi al $ PATH dell'utente root, assicurati solo che il suo PATH sia aggiornato, non il tuo PATH
Anthony Perot

Risposte:


48

controlla il tuo $ PATH

tox ha una modalità a riga di comando:

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

dov'è?

(modifica: le 2.7cose non hanno molta importanza qui, sub in any 3.xe pip si comportano più o meno allo stesso modo)

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

e cosa c'è nel mio $ 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...

Notare il /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin ? Questo è ciò che consente di trovare le mie cose installate da pip

Ora, per vedere dove le cose sono da Python, prova a fare questo (sostituto rosdepper tox).

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

che stampa:

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

Ora, cd nella directory proprio sopra libsopra. Vedi una directory bin ? Vedi rosdepin quel bidone? In tal caso, prova ad aggiungere il file binal tuo $ PATH.

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

produzione:

Headers
Python
Resources
bin
include
lib
man
share

Grazie JL per la risposta, ma questo è principalmente il mio problema. Per la mia app di esempio rosdep, quando faccio come hai fatto tu, ecco l'output ottenuto: pip list | grep rosdep rosdep (0.11.4) quale rosdep (nessun output), la riga di comando non restituisce nulla
Sanket_Diwale

1
che non restituire rosdepè coerente con il tuo problema. il punto è che devi trovare dove rosdepè installato e come appare $ PATH.
JL Peyret

Grazie, ho anche installato i miei binari in /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin. Aggiunto quello al PERCORSO e ora funziona. Grazie, ho avuto problemi a localizzare i binari poiché non fornivano alcun output.
Sanket_Diwale

export PATH = / opt / local / Library / Frameworks / Python.framework / Versions / 2.7 / bin: $ PATH mancava sui miei percorsi e ha fatto il trucco per me su OSX
Caio Iglesias

1
Se non riesci a trovare il programma con which(se non è ancora nel tuo percorso), puoi anche provare a trovare il binario usando mlocatesu linux o mdfindsu macOS.
jackcogdill

54

Su macOS con l'installazione predefinita di Python è necessario aggiungere /Users/<you>/Library/Python/2.7/bin/a $ PATH.

Aggiungi questo al tuo .bash_profile:

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

È qui che pip installa gli eseguibili.

Suggerimento: per la versione python non predefinita which pythonper trovare la posizione dell'installazione di python e sostituire quella parte nel percorso sopra. (Grazie per il suggerimento Sanket_Diwale)


8
Il luogo in cui si installa pip dipende da come hai installato python, MacOS ha diversi modi per installare python, come macports, homebrew e impostazioni predefinite del sistema. A seconda della versione di python in uso, avrai posizioni diverse per pip. Un modo semplice per capire dove si trovano pip e python sarebbe usare "which python" nel terminale e quindi aggiungere la posizione appropriata a $ PATH.
Sanket_Diwale

Per macOS 10.14.3 l'installazione di Python 3.6 da python.org, which python3alla fine mi ha portato (tramite un collegamento) a /Library/Frameworks/Python.framework/Versions/3.6/bin/.
phoenix

42

Se stai installando utilizzando --user(ad esempio pip3.6 install --user tmuxp), è possibile ottenere la directory di installazione utente specifica della piattaforma da Python stesso utilizzando il sitemodulo . Ad esempio, su macOS:

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

Aggiungendo /bina questo, ora abbiamo il percorso in cui verranno installati gli eseguibili del pacchetto. Possiamo popolare dinamicamente il PATH nel file rc della shell in base all'output; Sto usando bash, ma con un po 'di fortuna questo è portatile:

# 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"

Uso le versioni precise di Python per ridurre la possibilità che gli eseguibili "scompaiano" quando Python aggiorna una versione minore, ad esempio da 3.5 a 3.6. Scompariranno perché, come si può vedere sopra, il percorso di installazione dell'utente potrebbe includere la versione Python. Quindi, anche se python3potrebbe puntare a 3.5 o 3.6, python3.6punterà sempre a 3.6. Questo deve essere tenuto presente quando si installano ulteriori pacchetti, ad esempio use pip3.6over pip3.

Se non ti dispiace l'idea che i pacchetti scompaiano, puoi usare python2e python3invece:

# 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"

21

So che la domanda fa su macOS, ma ecco una soluzione per gli utenti Linux che arrivano qui tramite Google.

Stavo riscontrando il problema descritto in questa domanda, avendo installato il pacchetto pdfx tramite pip.

Quando l'ho eseguito, tuttavia, niente ...

pip list | grep pdfx
pdfx (1.3.0)

Ancora:

which pdfx
pdfx not found

Il problema su Linux è che pip install ...rilascia gli script ~/.local/bine questo non è su Debian / Ubuntu di default $PATH.

Ecco un problema di GitHub che va più in dettaglio: https://github.com/pypa/pip/issues/3813

Per risolvere il problema, aggiungi semplicemente ~/.local/binal tuo $PATH, ad esempio aggiungendo la seguente riga al tuo .bashrcfile:

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

Dopodiché, riavvia la shell e le cose dovrebbero funzionare come previsto.


2
Invece di riavviare la shell, puoi source ~/.bashrcricaricare la .bashrcconfigurazione
Whiteclaws

1
Grande. Ricevo "comando tossicologico non trovato". Dopo aver aggiornato PATH funziona
GabrielBB

5

Soluzione

In base ad altre risposte, per linuxe macpuoi eseguire quanto segue:

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

invece di python3è possibile utilizzare qualsiasi altro collegamento alla versione python: python, python2.7, python3.6, python3.9, etc.

Spiegazione

Per sapere dove sono installati i pacchetti utente nel sistema operativo corrente (win, mac, linux), eseguiamo:

python3 -m site --user-base

Sappiamo che gli script vanno nella bin/cartella in cui sono installati i pacchetti.

Quindi concateniamo i percorsi:

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

Quindi lo esportiamo in una variabile di ambiente.

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

Infine per evitare di ripetere il comando export lo aggiungiamo al nostro .bashrcfile e corriamo sourcead eseguire le nuove modifiche, dandoci la soluzione suggerita citata all'inizio.


Questo ha funzionato per me e non so perché
Benjamints

@ Benjamints ha aggiunto una spiegazione, spero che aiuti, buona fortuna!
Willemoes

Grazie mille! :)
Benjamints

3

Su Windows, devi aggiungere il percorso %USERPROFILE%\AppData\Roaming\Python\Scriptsal tuo percorso.


2

Mi sono imbattuto in questa domanda perché ho creato, costruito e pubblicato con successo un pacchetto PyPI, ma non sono riuscito a eseguirlo dopo l'installazione. La $PATHvariabile è stata impostata correttamente.

Nel mio caso il problema era che non avevo impostato entry_pointnel setup.pyfile:

entry_points = {'console_scripts':

['YOUR_CONSOLE_COMMAND=MODULE_NAME.FILE_NAME:FUNCTION_NAME'],},

2

Oltre ad aggiungere la bindirectory di python alla $PATHvariabile, ho anche dovuto cambiare il proprietario di quella directory, per farlo funzionare. Non ho idea del motivo per cui non ero già il proprietario.

chown -R ~/Library/Python/

0

Quando installi Python o Python3 utilizzando il programma di installazione di MacOS (scaricato dal sito Web di Python), aggiunge una exportER al tuo ~/.profilescript. Tutto quello che devi fare è proprio sourcequesto. Anche il riavvio di tutti i terminali dovrebbe fare il trucco.

ATTENZIONE - Credo che sia meglio usare solo pip3 con Python3 - per benefici futuri.

Se hai già installato Python3, i seguenti passaggi funzionano per me su macOS Mojave:

  1. Installa ansible prima usando sudo-sudo -H pip3 install ansible

  2. crei un collegamento simbolico al binpercorso di Python

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

e pinzalo .profile

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

  1. eseguire source ~/.profilee riavviare tutte le shell dei terminali.

  2. genere ansible --version

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.