モジュールまたはパッケージがすでにpython3にインストールされているかどうかを確認するにはどうすればよいですか?


10

プログラムを実行する前に、インストールされているかどうかを確認する必要があります。


2
だけを実行しpip installます。すでにインストールされている場合は、再度インストールされません。
ヨルダン2015年

よろしくお願いしますが、チェックしてao / pを指定してからテストする必要があります。
Hubatrix

回答:


3

シェルに次のように入力しますpydoc modules
これによりモジュールが一覧表示され、必要なモジュールをgrepできます。ここ
でstackoverflowに見つかりました


11

インストールされたパッケージのみを一覧表示するgrepでpiplistコマンドを使用する必要があります(すべてのモジュールとそのネイバーも同様ではありません)。

pip list | grep -F package_name

package_nameが複数のインストール済みパッケージに一致する場合(たとえば、もインストールされているboto場合の検索)は、@ TaraPrasadGurungが示唆しているように、代わりにbotocoreを使用-wすると-F役立ちます。-wパッケージ名に共通の文字が単語の境界として表示されるため、これは正確なパッケージをリストしません。そのためrequestsrequests-cacheor ruamel.yamlとruamel.yaml.cmd` をインストールしていて 、1行だけの出力が必要な場合は、次のようにする必要があります。

pip list --disable-pip-version-check | grep -E "^ruamel\.yaml "

.を使用すると-E、どの文字にも一致するため、エスケープする必要があることに注意してください。¹


¹ はい、パッケージがあるので必要ruamel_yamlです。pip名前空間パッケージを扱う場合、すべてのパッケージマネージャーが互換性があるわけではありません。


これの問題は、パッケージ名botoとbotocoreがインストールされている場合、両方をリストすることです。したがって、より適切な解決策は、-Fの代わりに-wフラグを使用して正確なパッケージをリストすることです
Tara Prasad Gurung

@TaraPrasadGurung出力をいくらか減らすのに役立ちますが、あなたが主張するように正確なパッケージを取得するのに役立ちません。たとえば、ドットとダッシュは-w単語の境界として使用され、パッケージ名では一般的です。grep -w ruamel.yamlor を使用して提案を使用すると、複数の一致が表示されます grep -w request
Anthon

pip list | grep -F mxnet-cu101印刷しますがmxnet-cu101 1.5.0、正確にインストールされている場所ではありません。インストール済みのパスを取得する方法はありますか?`
アヌ

@anyはい、名前がわかっていれば、Pythonパッケージがインストールされている場所を取得する方法については良い考えがあります。私はU&Lで新しく投稿された質問には従わないので、このサイトに質問を投稿し、あなたがそうするときに私の注意のためにここに私にpingを送信する必要があります。
Anthon

4

パッケージがインポートで奇妙なことや時間がかかることを行わない場合は、実際にインポートしてみることができます。

if python -c "import package_name" &> /dev/null; then
    echo 'all good'
else
    echo 'uh oh'
fi

2

既存の回答が不完全であり、十分な例がないことがわかりました。ここに私が解決した解決策があります:

# an example checking if the pandas package is installed
if python -c 'import pkgutil; exit(not pkgutil.find_loader("pandas"))'; then
    echo 'pandas found'
else
    echo 'pandas not found'
fi

この例のGithub要旨は、https//gist.github.com/shaypal5/d505af9953cd86f59c750fa600ee4ba6にあります。



1
bashコードは似ていますが、Pythonコードは異なります。私は自分の回答を追加する前に既存の回答をすべて読みましたが、リンクした特定の回答は私にとってはうまくいきませんでした。したがって、ここに私の回答を追加することは関連性があり価値があると思います。:)
ShayPal5 2018

1

スクリプトでこのようなものを使用することもできます。

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"

パッケージがインストールされていないときに得られるもの。

Package=psutil
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
1

パッケージがインストールされたときに得られるもの。

Package=requests
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
0

python2とpython3で動作し、終了コードに基づいてインストールします。


0

私は、スクリプトで使用するために、少し厳密なバージョンのAnthonの回答を使用しました。

pip3 list |
    grep -v "^Package *Version$" | grep -v "^-*$" |
    cut -d ' ' -f 1 |
    grep -xF "$package_name"

最初の2つのgrepsは、pip3の出力からヘッダー行を取り除くことを目的としています。

次に、カットはパッケージ名のみを選択します(バージョン番号は破棄されます)。

次に、最終的なgrepは、関連するものを正確に検索できます。 $package_name

パッケージが見つかると、パッケージ名が表示され、終了コード0が返されます。パッケージ名を表示したくない場合は、コマンドを >/dev/null



0

pip3でテスト済み:

$> pip3 show MODULENAME

モジュールがインストールされている場合、終了コード($?)は「0」、それ以外の場合は「1」になります。

Greppingには「誤検知」の問題があります。

pip list | grep NAME

名前が「NAME」を含むすべてのモジュールに一致します。たとえば、「some_other_NAME」にも一致します。

ながら

pip3 show MODULENAME

完全一致でのみ一致します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.