Какая разница между "pip install" и "python -m pip install"?

У меня есть локальная версия Python 3.4.1, и я могу запустить python -m pip install, но я не могу найти двоичный файл pip для запуска pip install. Какая разница между этими двумя?

Ответ 1

2014

Они делают то же самое. Фактически, документы по распространению модулей 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.