2014年
他们做的完全一样。事实上,用于分发Python模块的文档建议使用python -m pip而不是pip可执行文件,因为这样更容易判断哪个版本的Python将用于实际运行pip。
这里有一些更具体的“证据”,不仅仅是相信我的话和我链接的bug报告:)
如果您查看pip可执行脚本,它只会执行以下操作:from pkg_resources import load_entry_point
load_entry_point('pip==1.5.4', 'console_scripts', 'pip')()
它调用^{},返回一个函数,然后执行该函数。它使用的入口点称为'console_scripts'。如果你在我的Ubuntu机器上查看pip(/usr/lib/python2.7/dist-packages/pip-1.5.4.egg-info/entry_points.txt)的entry_points.txt文件,你会看到:[console_scripts]
pip = pip:main
pip2.7 = pip:main
pip2 = pip:main
所以返回的入口点是pip模块中的main函数。
运行python -m pip时,您正在pip包中执行__main__.py脚本。看起来是这样的: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函数。所以这两个命令最后都在pip/__init__.py中调用相同的main函数。