J'ai une version locale de Python 3.4.1 et je peux exécuter python -m pip install
, mais je ne parviens pas à trouver le binaire pip pour exécuter pip install
. Quelle est la différence entre ces deux?
Ils font exactement la même chose. En fait, les documents pour distribuer Python étaient juste mis à jour pour suggérer d'utiliser python -m pip
au lieu de l'exécutable pip
, car il est plus facile de dire quelle version de python va être utilisée pour exécuter réellement pip
de cette façon.
Modifier:
Voici quelques "preuves" plus concrètes, au-delà de la simple confiance en mon Word et le rapport de bogue que j'ai lié :)
Si vous jetez un oeil au script exécutable pip
, il fait juste ceci:
from pkg_resources import load_entry_point
<snip>
load_entry_point('pip==1.5.4', 'console_scripts', 'pip')()
Il appelle load_entry_point
, qui renvoie une fonction, puis exécute cette fonction. Le point d'entrée qu'il utilise s'appelle 'console_scripts'
. Si vous regardez le fichier entry_points.txt pour pip
(/usr/lib/python2.7/dist-packages/pip-1.5.4.Egg-info/entry_points.txt sur ma machine Ubuntu), vous verra ceci:
[console_scripts]
pip = pip:main
pip2.7 = pip:main
pip2 = pip:main
Le point d'entrée renvoyé est donc la fonction main
dans le module pip
.
Lorsque vous exécutez python -m pip
, vous exécutez le __main__.py
script dans le package pip
. Cela ressemble à ceci:
import sys
from .runner import run
if __name__ == '__main__':
exit = run()
if exit:
sys.exit(exit)
Et le runner.run
la fonction ressemble à ceci:
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()
Comme vous pouvez le voir, il appelle simplement le pip.main
fonction aussi. Donc, les deux commandes finissent par appeler la même fonction main
dans pip/__init__.py
.