В чем разница между "pip install" и "python -m pip install"?
У меня есть локальная версия Python 3.4.1, и я могу запустить python -m pip install
, но я не могу найти бинарный файл для запуска pip install
, В чем разница между этими двумя?
3 ответа
Они делают то же самое. Фактически, документы для распространения модулей Python были только обновлены, чтобы предложить использовать python -m pip
вместо pip
исполняемый файл, потому что легче сказать, какая версия python будет использоваться для фактического запуска pip
сюда.
Редактировать:
Вот еще несколько конкретных "доказательств", помимо простого доверия к моему слову и сообщению об ошибке, которое я связал:)
Если вы посмотрите на pip
исполняемый скрипт, он просто делает это:
from pkg_resources import load_entry_point
<snip>
load_entry_point('pip==1.5.4', 'console_scripts', 'pip')()
Это звонит load_entry_point
, который возвращает функцию, а затем выполняет эту функцию. Используемая точка входа называется 'console_scripts'
, Если вы посмотрите на файл entry_points.txt для pip
(/usr/lib/python2.7/dist-packages/pip-1.5.4.egg-info/entry_points.txt на моем компьютере с Ubuntu), вы увидите это:
[console_scripts]
pip = pip:main
pip2.7 = pip:main
pip2 = pip:main
Таким образом, возвращаемая точка входа является main
функция в pip
модуль.
Когда ты бежишь python -m pip
исполняешь __main__.py
сценарий внутри pip
пакет. Это выглядит так:
import sys
from .runner import run
if __name__ == '__main__':
exit = run()
if exit:
sys.exit(exit)
И runner.run
функция выглядит так:
def run():
base = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
## FIXME: this is kind of crude; if we could create a fake pip
## module, then exec into it and update pip.__path__ properly, we
## wouldn't have to update sys.path:
sys.path.insert(0, base)
import pip
return pip.main()
Как видите, это просто вызов pip.main
функция тоже. Так что обе команды в конечном итоге вызывают один и тот же main
функция в pip/__init__.py
,
2021 г.
pip install
и - не совсем то же самое. Или добро пожаловать обратно в АД ВЕРСИОНИРОВАНИЯ И ЗАВИСИМОСТИ :-(
Я привык печатать
pip(.exe) install <name>
если я хочу установить пакет. Но у меня возникают проблемы, если я пытаюсь установить пакет Pillow. Каждый раз ломается с сообщением об ошибке.
Сегодня я повторяю
python -m pip install
скопируйте и вставьте из руководства, и он работает. Раньше я игнорировал это и набирал pip .... Потому что я думал, что это то же самое.
Я начинаю немного углубляться в pip и нахожу этот вопрос / ответ. Через некоторое время я обнаружил, что pip.exe вызывает сценарий <virtual-environment / Scripts>pip-script.py.
Бьюсь с установкой пакета Pillow.
#!C:\Users\anha2347\PycharmProjects\testAutoFilter\venv\Scripts\python.exe
# EASY-INSTALL-ENTRY-SCRIPT: 'pip==19.0.3','console_scripts','pip3'
__requires__ = 'pip==19.0.3'
import re
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(
load_entry_point('pip==19.0.3', 'console_scripts', 'pip3')()
)
Я был немного удивлен, что pip.exe по-прежнему использует старую версию 19.0.3 пакета, а не новую установленную версию 21.0.1.
Я вручную изменил две строки версии на 21.0.1. И теперь pip.exe смог правильно установить Pillow.
Теперь я понимаю, почему pip до сих пор жалуется, что я использую старую версию pip.
Я думаю, что у старого v19 pip есть проблема с обнаружением поддерживаемой платформы, и поэтому вместо двоичных файлов устанавливаются исходники.
Каждая установка Python потенциально поставляется с собственной версией Pip. (Некоторые установки могут намеренно исключать Pip по соображениям безопасности: например, когда Python включен в дистрибутив Linux, он обычно опускает Pip, чтобы пользователь случайно не установил что-то вредное в копию Python, от которой зависит операционная система.)
Концептуально Pip состоит из двух частей: модуля стандартной библиотеки, содержащегося в файле; и исполняемый файл-обертка. (В Windows это реализовано в виде реального файла .exe; в Mac и Linux это должен быть просто скрипт Python, у которого установлены права выполнения и который не имеет
Использование командной строки позволит найти и запустить тот исполняемый файл оболочки, который находится первым в переменной среды PATH, а затем запустить соответствующий код Python для установки Python, связанного с этой оболочкой. Поэтому он установит сторонние библиотеки для любого Python.
Использование в командной строке найдет и запустит тот Python , который находится первым в переменной среды PATH, и поручит ему найти модуль стандартной библиотеки в своей стандартной библиотеке (не напрямую; он будет искать
В Windows с помощью
В зависимости от того, как настроена система, эти команды могут не все выбирать одну и ту же установку Python .
С использованиемpython myscript.py
. Это очень полезно для тех, кто пишет
Специальное примечание для Windows: