LoginSignup
0
0

More than 1 year has passed since last update.

モジュールがないなら(半)自動でインストールすればいいじゃない

Posted at

Qiitaは今まで見る専だったのですが、情報整理やスキルアップも兼ねて恐る恐る記事を書いてみました。

環境

  • Windows 10
  • Python2.7 及び 3.7
  • PyCharm 2020

端的にまとめると

長くなってしまったためやったことを端的にまとめると
1. 『pkgutil.iter_modules()』を使用して全モジュールの一覧を取得
2. インストールしたいモジュールの一覧から全モジュール一覧にないモジュール名を抽出
3. 『subprocess.call()』でインストールしたいpipに抽出したモジュール一覧を文字列にして渡す

以上になります。

こんなことが以前ありました

Python2と3の両方で動く処理を検証する度に別々の仮想環境をPyCharmで作成していてモジュールをインストールしてる時にふと思いました。

「これ、違う環境で度々インストールしなくちゃいけないのどうにかならないかな」
と。

インストールする作業もモジュールを一つ追加するだけなら問題無いとは思います。ですがそれ以上になるともうやってられなくて・・・。

そして思ったわけです。
「自分で作ってみるか・・・?」
と。

必要になりそうな要素を挙げていく

  • インストールするモジュールの一覧
    • これに関しましては自分で用意すれば良いですね
  • インストールされているモジュールの一覧
    • 既にインストールされているモジュールのことを考えるとこれをどうするかが鍵

インストールされているモジュールの一覧を取得してみる

公式ドキュメントを探した結果『pkgutil.iter_modules』を使うことで読み込めるモジュールの情報を取得出来そうなのでそこから一覧を抽出してみます。

import pkgutil

pkg_list = [pkg for pkg in pkgutil.iter_modules()]

取得したリストの中を見てみると1番目にモジュール名っぽいのが格納されているのを確認出来ました。ということなので以下のようにしてみました。

import pkgutil

pkg_list = [pkg[1] for pkg in pkgutil.iter_modules()]

インストールしたいモジュールの一覧として抽出してみる

では次にインストール処理を無駄に走らせない為にインストールされているモジュールを除いたリストを作成してみます。

important   = [] # インポートしたいモジュール名のリスト
import_list = [i for i in important if i not in pkg_list]

これでリストが出来ました。それでは作成したリストからpipに渡す引数の文字列を作成してインストールができるか走ってもらいます。

pipでモジュールをインストール

subprocessモジュールを使ってpipでインストールする際の記述をします。

import sys
import subprocess

if len(import_list) > 0:
    subprocess.call("{} -m pip install {}".format(sys.executable.replace("\\", "/"), " ".join(import_list)))

こんな感じになりました。今実行しているPythonの環境に紐づいているpipにインストールしたいのでsys.executable関数を使用してPythonの実行ファイルパスを取得してます。

結果

処理を走らせた後にpipのモジュール一覧を見てみるとモジュールをきちんとインストールできてることが確認できました。

おまけ

試しにこれらの処理の後にpipにインストールしたモジュールをインポートする記述をした上で処理を走らせてみましたが問題なく動く模様。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0