1. ホーム
  2. python

[解決済み] pip install" と "python -m pip install" の違いは何ですか?

2023-04-24 08:50:32

質問

Python 3.4.1のローカルバージョンを持っていて、以下のように実行することができます。 python -m pip install を実行するためのpipバイナリを見つけることができません。 pip install . この2つの違いは何ですか?

どのように解決するのですか?

2014

全く同じことをするのです。実際、Python モジュールを配布するためのドキュメントは が更新されたばかりです。 を使うことを推奨しています。 python -m pip の代わりに pip を実際に実行するためにどのバージョンの python が使われるかを知るのが簡単だからです。 pip を実際に実行するためにどのバージョンの python が使われるかを知るのが簡単だからです。


私の言葉やリンク先のバグ報告を信じるだけでなく、より具体的な "proof" がここにあります :) 。

もしあなたが pip の実行スクリプトを見ると、これをやっているだけです。

from pkg_resources import load_entry_point
<snip>
load_entry_point('pip==1.5.4', 'console_scripts', 'pip')()

呼び出しているのは load_entry_point を呼び出して関数を返し、その関数を実行しています。この関数が使っているエントリーポイントは 'console_scripts' . の entry_points.txt ファイルを見てみましょう。 pip (私の 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

つまり、返されるエントリーポイントは main の中の関数です。 pip モジュールに追加します。

を実行すると python -m pip を実行するとき、あなたは __main__.py の中でスクリプトを実行しています。 pip パッケージの中にあります。それは次のようになります。

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 関数も呼び出しています。つまり、どちらのコマンドも結局は同じ main 関数を呼び出すことになります。 pip/__init__.py .