[英]What is the difference between `pip install package` and `python -m pip install package`?
[英]What's the difference between "pip install" and "python -m pip install"?
我有 Python 3.4.1 的本地版本,我可以運行python -m pip install
,但我找不到 pip 二進制文件來運行pip install
。 這兩者有什么區別?
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'
。 如果您查看pip
的 entry_points.txt 文件(我的 Ubuntu 機器上的 /usr/lib/python2.7/dist-packages/pip-1.5.4.egg-info/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
函數。
2021年
僅當您使用 PyCharm 創建 venv 時才會發生這種情況。 請檢查 Scripts/pip-script.py 是否位於您的虛擬環境中
pip install
和python -m pip install
-- 並不完全相同。 或者歡迎回到版本和依賴的地獄:-(
如果我想安裝一個包,我習慣於輸入pip(.exe) install <name>
。 但是我遇到了麻煩,如果我嘗試安裝包 Pillow。 它每次都會因錯誤消息而中斷。
今天我重試了手冊中的python -m pip install
copy&pasted 並且它有效。 在我忽略它並輸入 pip .... 因為我認為它是相同的。
我開始更深入地研究 pip,我找到了這個問題/答案。 過了一會兒,我發現 pip.exe 調用了腳本 <virtual-environment/Scripts>pip-script.py。
我用安裝包打枕頭。
#! .\venv\Scripts\python.exe
# EASY-INSTALL-ENTRY-SCRIPT: 'pip==19.0.3','console_scripts','pip3'
__requires__ = 'pip==19.0.3'
import re
import sys
from pkg_resources import load_entry_point
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(
load_entry_point('pip==19.0.3', 'console_scripts', 'pip3')()
)
我有點驚訝 pip.exe 仍然使用舊版本的包 19.0.3 而不是新安裝的版本 21.0.1。
我手動將兩個版本字符串更改為 21.0.1。 現在 pip.exe 能夠正確安裝 Pillow。
從現在開始我明白為什么 pip 仍然抱怨我使用舊版本的 pip。
我認為舊的 v19 pip 在檢測支持的平台方面存在問題,因此安裝了源代碼而不是二進制文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.