簡體   English   中英

“pip install”和“python -m pip install”有什么區別?

[英]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 installpython -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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM