pip pomyślnie instaluje pakiety, ale nie znaleziono plików wykonywalnych z wiersza poleceń

113

Pracuję na systemie Mac OS X Yosemite w wersji 10.10.3.

Zainstalowałem Python2.7 i pip używając macport, jak to zrobiono w http://johnlaudun.org/20150512-installing-and-setting-pip-with-macports/

Mogę z powodzeniem instalować pakiety i importować je do mojego środowiska Python i skryptów Pythona. Jednak żaden plik wykonywalny powiązany z pakietem, który można wywołać z wiersza poleceń w terminalu, nie zostanie znaleziony.

Czy ktoś wie, co może być nie tak? (Więcej szczegółów poniżej)

Na przykład podczas instalowania pakietu o nazwie „rosdep” zgodnie z instrukcjami na http://wiki.ros.org/jade/Installation/Source

Mogę uruchomić: sudo pip install -U rosdep który instaluje się bez błędów, a odpowiednie pliki znajdują się w/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages

Jeśli jednak spróbuję uruchomić sudo rosdep init:, wyświetla błąd:"sudo: rosdep: command not found"

To nie jest błąd związany z pakietem. Otrzymuję to dla każdego pakietu zainstalowanego przy użyciu pip na moim komputerze. Próbowałem nawet dodać

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

do mojego $PATH. Ale plików wykonywalnych nie można znaleźć w wierszu poleceń, mimo że pakiety działają doskonale z poziomu Pythona.

Sanket_Diwale
źródło
zaangażowany jest jakiś virtualenv?
JL Peyret
nie, nie jest zaangażowany żaden virtualenv.
Sanket_Diwale,
kiedy sudo przełączeniu do $ PATH użytkownika głównego, wystarczy upewnić się, jego ścieżka jest aktualizowany, a nie PATH
Anthony Perot

Odpowiedzi:

48

sprawdź swoją $ PATH

tox ma tryb linii poleceń:

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

gdzie to jest?

(edytuj: 2.7rzeczy nie mają tutaj większego znaczenia, sub w każdym, 3.xa pip zachowuje się prawie tak samo)

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

a co jest w mojej $ 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...

Zwróć uwagę na /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin ? To właśnie pozwala znaleźć moje rzeczy zainstalowane w pip

Teraz, aby zobaczyć, gdzie rzeczy są z Python, spróbuj robić to (substytut rosdepdla tox).

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

który drukuje:

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

Teraz przejdź do katalogu powyżej libw powyższym. Czy widzisz katalog bin ? Czy widzisz rosdepw tym koszu? Jeśli tak, spróbuj dodać bindo swojej $ PATH.

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

wynik:

Headers
Python
Resources
bin
include
lib
man
share
JL Peyret
źródło
Dzięki JL za odpowiedź, ale to głównie mój problem. Dla mojej przykładowej aplikacji rosdep, kiedy robię to, co zrobiłeś, oto otrzymane dane wyjściowe: lista pip | grep rosdep rosdep (0.11.4) który rosdep (brak wyjścia), wiersz poleceń nic nie zwraca
Sanket_Diwale
1
które nie wraca, rosdepjest zgodne z Twoim problemem. chodzi mi o to, że musisz znaleźć miejsce, w którym rosdepjest zainstalowany i jak wygląda $ PATH.
JL Peyret,
Dzięki, moje pliki binarne również zostały zainstalowane w /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin. Dodano to do PATH i teraz działa. Dzięki, miałem problem ze znalezieniem plików binarnych, ponieważ nie zapewniały one żadnego wyniku.
Sanket_Diwale
export PATH = / opt / local / Library / Frameworks / Python.framework / Versions / 2.7 / bin: $ PATH brakowało na moich ścieżkach i załatwiło mi sprawę na OSX
Caio Iglesias
1
Jeśli nie możesz znaleźć programu za pomocą which(jeśli nie jest jeszcze na Twojej ścieżce), możesz również spróbować znaleźć plik binarny, używając systemu mlocateLinux lub mdfindMacOS.
jackcogdill
54

Na macOS z domyślną instalacją Pythona musisz dodać /Users/<you>/Library/Python/2.7/bin/do swojej $ PATH.

Dodaj to do swojego .bash_profile:

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

Tam pip instaluje pliki wykonywalne.

Wskazówka: w przypadku innej niż domyślna wersji which pythonjęzyka Python, aby znaleźć lokalizację instalacji języka Python i zastąpić tę część w ścieżce powyżej. (Dzięki za podpowiedź Sanket_Diwale)

joh-mue
źródło
8
Miejsce, w którym instaluje się pip, zależy od sposobu zainstalowania Pythona, MacOS ma wiele sposobów instalacji Pythona, takich jak macports, homebrew i system default. W zależności od używanej wersji Pythona będziesz mieć różne lokalizacje dla pip. Łatwym sposobem na ustalenie, gdzie znajdują się pip i python, byłoby użycie „który python” w terminalu, a następnie dodanie odpowiedniej lokalizacji do zmiennej $ PATH.
Sanket_Diwale
W przypadku macOS 10.14.3 instalacja Pythona 3.6 z python.org which python3doprowadziła mnie ostatecznie (przez link) do /Library/Frameworks/Python.framework/Versions/3.6/bin/.
phoenix
42

Jeśli instalujesz przy użyciu --user(np. pip3.6 install --user tmuxp), Możliwe jest pobranie katalogu instalacyjnego użytkownika dla konkretnej platformy z samego Pythona za pomocą sitemodułu . Na przykład w systemie macOS:

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

Dołączając /bindo tego, mamy teraz ścieżkę, w której zostaną zainstalowane pliki wykonywalne pakietu. Możemy dynamicznie zapełniać PATH w pliku rc twojej powłoki w oparciu o wynik; Używam basha, ale przy odrobinie szczęścia jest to przenośne:

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

Używam dokładnych wersji Pythona, aby zmniejszyć ryzyko, że pliki wykonywalne po prostu „znikną”, gdy Python zaktualizuje wersję pomocniczą, np. Z 3.5 do 3.6. Znikną, ponieważ, jak widać powyżej, ścieżka instalacji użytkownika może zawierać wersję Pythona. Więc chociaż python3może wskazywać na 3,5 lub 3,6, python3.6zawsze będzie wskazywać na 3,6. Należy o tym pamiętać podczas instalowania kolejnych pakietów, np. Use pip3.6over pip3.

Jeśli nie przeszkadza Ci pomysł znikania pakietów, możesz użyć python2i python3zamiast tego:

# 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
źródło
25

Wiem, że pytanie dotyczy macOS, ale tutaj jest rozwiązanie dla użytkowników Linuksa, którzy przybywają tutaj przez Google.

Miałem problem opisany w tym pytaniu, po zainstalowaniu pakietu pdfx przez pip.

Kiedy go uruchomiłem, nic ...

pip list | grep pdfx
pdfx (1.3.0)

Jeszcze:

which pdfx
pdfx not found

Problem w Linuksie polega na tym, że pip install ...upuszcza skrypty ~/.local/bini nie ma tego w domyślnym Debianie / Ubuntu $PATH.

Oto bardziej szczegółowy problem z GitHub: https://github.com/pypa/pip/issues/3813

Aby to naprawić, po prostu dodaj ~/.local/bindo swojego $PATH, na przykład dodając następujący wiersz do .bashrcpliku:

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

Następnie uruchom ponownie powłokę i wszystko powinno działać zgodnie z oczekiwaniami.

James Hibbard
źródło
2
Zamiast restartować powłokę, możesz source ~/.bashrcprzeładować .bashrckonfigurację
Whiteclaws
1
Wspaniały. Otrzymałem komunikat „Nie znaleziono polecenia toksykologicznego”. Po aktualizacji PATH działa
GabrielBB
8

Rozwiązanie

W oparciu o inne odpowiedzi, dla linuxi macmożesz uruchomić:

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

zamiast python3można użyć dowolnego innego linku do wersji Pythona: python, python2.7, python3.6, python3.9, itd.

Wyjaśnienie

Aby wiedzieć, gdzie w aktualnym systemie operacyjnym (win, mac, linux) są zainstalowane pakiety użytkownika, uruchamiamy:

python3 -m site --user-base

Wiemy, że skrypty trafiają do bin/folderu, w którym są instalowane pakiety.

Więc łączymy ścieżki:

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

Następnie eksportujemy to do zmiennej środowiskowej.

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

Na koniec, aby uniknąć powtórzenia polecenia eksportu, dodajemy je do naszego .bashrcpliku i sourceuruchamiamy nowe zmiany, podając nam sugerowane rozwiązanie wspomniane na początku.

Willemoes
źródło
@Benjamints dodał wyjaśnienie, mam nadzieję, że pomoże, powodzenia!
Willemoes
3

W systemie Windows musisz dodać ścieżkę %USERPROFILE%\AppData\Roaming\Python\Scriptsdo swojej ścieżki.

Plaża Jared
źródło
2

Natknąłem się na to pytanie, ponieważ stworzyłem, pomyślnie zbudowałem i opublikowałem pakiet PyPI, ale nie mogłem go wykonać po instalacji. $PATHZmienna został prawidłowo ustawiony.

W moim przypadku problem polegał na tym, że nie ustawiłem entry_point w setup.pypliku:

entry_points = {'console_scripts':

['YOUR_CONSOLE_COMMAND=MODULE_NAME.FILE_NAME:FUNCTION_NAME'],},
Thomas Johannesmeyer
źródło
2

Oprócz dodania binkatalogu Pythona do $PATHzmiennej musiałem również zmienić właściciela tego katalogu, aby działał. Nie mam pojęcia, dlaczego nie byłem już właścicielem.

chown -R ~/Library/Python/
d4Rk
źródło
1

Kiedy instalujesz Python lub Python3 za pomocą instalatora MacOS (pobranego ze strony Pythona) - dodaje on exporter do twojego ~/.profileskryptu. Wszystko, co musisz zrobić, to po prostusource . Ponowne uruchomienie wszystkich terminali również powinno załatwić sprawę.

OSTRZEŻENIE - uważam, że lepiej po prostu używać pip3 z Python3 - dla przyszłych korzyści.

Jeśli masz już zainstalowany Python3, poniższe kroki działają dla mnie na macOS Mojave:

  1. Najpierw zainstaluj ansible za pomocą sudo-sudo -H pip3 install ansible

  2. tworzysz dowiązanie symboliczne do binścieżki Pythona

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

i zszyj go .profile

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

  1. uruchom source ~/.profilei zrestartuj wszystkie powłoki terminali.

  2. Rodzaj ansible --version

ha9u63ar
źródło
+1 za instrukcję otwierającą (po prostu uruchom ponownie .profile lub wyloguj się i zaloguj ponownie) po użyciu pip3 do zainstalowania pakietu Python cmdline.
automorficzny