pip успешно устанавливает пакеты, но исполняемые файлы не найдены в командной строке


113

Я работаю над Mac OS X Yosemite версии 10.10.3.

Я установил python2.7 и pip, используя macport, как это сделано в http://johnlaudun.org/20150512-installing-and-setting-pip-with-macports/

Я могу успешно устанавливать пакеты и импортировать их в свою среду Python и сценарии Python. Однако никаких исполняемых файлов, связанных с пакетом, которые можно вызвать из командной строки в терминале, не обнаружено.

Кто-нибудь знает, что может быть не так? (Подробнее см. Ниже)

Например, при установке пакета под названием «rosdep», как указано в http://wiki.ros.org/jade/Installation/Source

Я могу запустить: sudo pip install -U rosdep который устанавливается без ошибок и соответствующие файлы находятся в/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages

Однако, если я попытаюсь запустить:, sudo rosdep initпоявится ошибка:"sudo: rosdep: command not found"

Это не ошибка конкретного пакета. Я получаю это для любого пакета, установленного с помощью pip на моем компьютере. Я даже пробовал добавить

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

к моему $PATH. Но исполняемые файлы не находятся в командной строке, хотя пакеты отлично работают изнутри python.


задействован какой-либо virtualenv?
JL Peyret

нет, никакой virtualenv не задействован.
Sanket_Diwale 09

когда вы выполняете sudo, вы переключаетесь на $ PATH пользователя root, просто убедитесь, что обновлен его PATH, а не ваш PATH
Энтони Перо,

Ответы:


48

проверьте свой $ PATH

tox имеет режим командной строки:

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

где это находится?

(редактировать: здесь 2.7все не так важно, sub в любом 3.xи pip ведут себя примерно так же)

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

и что в моем $ 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...

Обратите внимание на /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin ? Это то, что позволяет найти мой установленный pip

Теперь, чтобы увидеть , где вещи из Python, попытайтесь делать это (заменитель rosdepдля tox).

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

который распечатывает:

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

Теперь перейдите в каталог прямо над libвышеупомянутым. Вы видите каталог bin ? Вы видите rosdepв этой корзине? Если да, попробуйте добавить в binсвой $ PATH.

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

вывод:

Headers
Python
Resources
bin
include
lib
man
share

Спасибо JL за ответ, но это в основном моя проблема. В моем примере приложения rosdep, когда я делаю то же самое, что и вы, вот результат: pip list | grep rosdep rosdep (0.11.4) which rosdep (no output), командная строка ничего не возвращает
Sanket_Diwale 09

1
который не возвращается rosdep, соответствует вашей проблеме. Я хочу сказать, что вам нужно найти, где rosdepон установлен и как выглядит $ PATH.
JL Peyret

Спасибо, мои двоичные файлы также были установлены в /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin. Добавил это в PATH, и теперь он работает. Спасибо, мне не удалось найти двоичные файлы, поскольку они не давали никаких результатов.
Sanket_Diwale

export PATH = / opt / local / Library / Frameworks / Python.framework / Versions / 2.7 / bin: $ PATH отсутствовал на моих путях и помог мне в OSX
Кайо Иглесиас

1
Если вы не можете найти программу с помощью which(если ее еще нет на вашем пути), вы также можете попробовать найти двоичный файл, используяmlocate в Linux или mdfindMacOS.
jackcogdill

54

В macOS с установкой Python по умолчанию вам нужно добавить /Users/<you>/Library/Python/2.7/bin/в свой $ PATH.

Добавьте это в свой .bash_profile:

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

Вот где pip устанавливает исполняемые файлы.

Совет: Для версии Python, отличной от используемой по умолчанию, which pythonнеобходимо найти местоположение вашей установки Python и заменить эту часть в указанном выше пути. (Спасибо за подсказку Sanket_Diwale)


8
Место, где устанавливается pip, зависит от того, как вы установили python, в MacOS есть несколько способов установки python, таких как macports, homebrew и system default. В зависимости от того, какая версия python используется, у вас будут разные места для pip. Простой способ выяснить, где расположены pip и python, - это использовать в терминале «which python» и затем добавить соответствующее местоположение в $ PATH.
Sanket_Diwale

Для macOS 10.14.3 установка Python 3.6 с python.org в which python3конечном итоге привела меня (через ссылку) к /Library/Frameworks/Python.framework/Versions/3.6/bin/.
феникс

42

Если вы устанавливаете с помощью --user(например pip3.6 install --user tmuxp), можно получить каталог установки пользователя для конкретной платформы из самого Python с помощью siteмодуля . Например, в macOS:

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

Добавив /binэто, мы теперь имеем путь, по которому будут установлены исполняемые файлы пакета. Мы можем динамически заполнять PATH в rc-файле вашей оболочки на основе вывода; Я использую bash, но если повезет, это переносимо:

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

Я использую точные версии Python, чтобы уменьшить вероятность того, что исполняемые файлы просто «исчезнут», когда Python обновит младшую версию, например, с 3.5 до 3.6. Они исчезнут, потому что, как видно выше, путь установки пользователя может включать версию Python. Таким образом, если python3можно указать на 3,5 или 3,6, python3.6всегда будет указывать на 3,6. Это необходимо учитывать при установке дополнительных пакетов, например, при использовании pip3.6over pip3.

Если вы не против исчезновения пакетов, вы можете вместо этого использовать python2и python3:

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

25

Я знаю, что вопрос касается macOS, но вот решение для пользователей Linux, которые приходят сюда через Google.

У меня возникла проблема, описанная в этом вопросе, после установки pdfx пакета через pip.

Однако когда я его запустил, ничего ...

pip list | grep pdfx
pdfx (1.3.0)

Все же:

which pdfx
pdfx not found

Проблема в Linux заключается в том, что pip install ...скрипты сбрасываются, ~/.local/binа этого нет в Debian / Ubuntu по умолчанию.$PATH .

Вот проблема с GitHub более подробно: https://github.com/pypa/pip/issues/3813

Чтобы исправить это, просто добавьте ~/.local/binв свой $PATH, например, добавив в свой .bashrcфайл следующую строку :

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

После этого перезапустите оболочку, и все должно работать, как ожидалось.


2
Вместо перезапуска оболочки вы можете source ~/.bashrcперезагрузить .bashrcконфигурацию
Whiteclaws

1
Отлично. Я получал «команда tox не найдена». После обновления PATH он работает
GabrielBB

8

Решение

Основываясь на других ответах, для linuxи macвы можете запустить следующее:

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

вместо того , python3вы можете использовать любую другую ссылку на питон версию: python, python2.7, python3.6, python3.9и т.д.

Объяснение

Чтобы узнать, где установлены пользовательские пакеты в текущей ОС (win, mac, linux), мы запускаем:

python3 -m site --user-base

Мы знаем, что скрипты попадают в bin/папку, где установлены пакеты.

Итак, мы объединяем пути:

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

Затем мы экспортируем это в переменную среды.

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

Наконец, чтобы избежать повторения команды экспорта, мы добавляем ее в наш .bashrcфайл и запускаем sourceдля выполнения новых изменений, что дает нам предлагаемое решение, упомянутое в начале.


@Benjamints добавил объяснение, надеюсь, это поможет, удачи!
Виллемоэс,


2

Я наткнулся на этот вопрос, потому что создал, успешно собрал и опубликовал пакет PyPI, но не смог выполнить его после установки. $PATHПеременная была правильно установлена.

В моем случае проблема заключалась в том, что я не установил entry_pointв setup.pyфайле:

entry_points = {'console_scripts':

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

2

Помимо добавления binкаталога python в $PATHпеременную, мне также пришлось изменить владельца этого каталога, чтобы он работал. Понятия не имею, почему я уже не был владельцем.

chown -R ~/Library/Python/

1

Когда вы устанавливаете Python или Python3 с помощью установщика MacOS (загруженного с веб-сайта Python), он добавляет exportэр в ваш ~/.profileскрипт. Все, что вам нужно сделать, это простоsource это. Перезагрузка всех терминалов также должна помочь.

ВНИМАНИЕ - я считаю, что лучше просто использовать pip3 с Python3 - для будущих преимуществ.

Если у вас уже установлен Python3, в macOS Mojave мне подойдут следующие шаги:

  1. Сначала установите ansible, используя sudo-sudo -H pip3 install ansible

  2. вы создаете символическую ссылку на binпуть Python

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

и прикрепить его к .profile

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

  1. запустить source ~/.profileи перезапустить все терминальные оболочки.

  2. Тип ansible --version


+1 для вашего вступительного заявления (просто перезапустите .profile или выйдите из системы и снова войдите) после использования pip3 для установки пакета python cmdline.
автоморфный
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.