web-dev-qa-db-fra.com

Quelle est la différence entre "pip install" et "python -m pip install"?

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?

34
ilciavo

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.

37
dano