В чем разница между "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, и поручит ему найти модуль стандартной библиотеки в своей стандартной библиотеке (не напрямую; он будет искатькак и при импорте любого модуля) и запустите его « как модуль ». Поэтому он установит сторонние библиотеки для Python, найденного в PATH.

В Windows с помощьюв командной строке (если система не настроена неправильно) найдет и запустит исполняемый файл , который устанавливается в каталог Windows, который всегда будет находиться в PATH. Это, в свою очередь, будет использовать собственную логику для выбора Python в системе, запуска его , и дальше все происходит так же, как и раньше.

В зависимости от того, как настроена система, эти команды могут не все выбирать одну и ту же установку Python .

С использованиемгарантирует, что библиотеки установлены для того же Python, который будет работать, используя python myscript.py. Это очень полезно для тех, кто пишет, нужен этот код для использования библиотеки, которая будет установлена, и вы хотите, чтобы она работала с любойто есть.

Специальное примечание для Windows: не будет работать . Это связано с тем, что обновление Pip включает замену исполняемого файла оболочки Pip на диске; при таком запуске команды исполняемый файл-оболочка является запущенной программой , и Windows запрещает программам заменять себя на диске. Используя, иливместо этого проблема избегается, поскольку теперь исполняемый файл оболочки не запускается - Python (и, возможно, также) запускается с использованием кода из(или кэшированный) файл.

Другие вопросы по тегам