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