[解決済み] モジュール名を文字列で指定してインポートするには?
質問
Pythonで、例えばコマンドを引数に取るようなアプリケーションを書いています。
$ python myapp.py command1
私はこのアプリケーションを拡張可能なものにしたいのです。つまり、メインのアプリケーションのソースを変更することなく、新しいコマンドを実装する新しいモジュールを追加できるようにしたいのです。ツリーは以下のような感じです。
myapp/
__init__.py
commands/
__init__.py
command1.py
command2.py
foo.py
bar.py
そこで、アプリケーションは実行時に利用可能なコマンドモジュールを見つけ、適切なものを実行するようにしたいのです。
Pythonでは __import__ 関数は、モジュール名を文字列で受け取ります。
__import__(name, globals=None, locals=None, fromlist=(), level=0)
この関数はモジュール名をインポートし、パッケージコンテキストでその名前をどのように解釈するかを決定するために、与えられたグローバルとローカルを潜在的に使用します。fromlist は、名前で与えられたモジュールからインポートされるべきオブジェクトまたはサブモジュールの名前を与えます。
だから現在、私は次のようなものを持っています。
command = sys.argv[1]
try:
command_module = __import__("myapp.commands.%s" % command, fromlist=["myapp.commands"])
except ImportError:
# Display error message
command_module.run()
ただ、このコードでやっていることを達成するために、もっと簡単な方法があるのではないかと思っています。
なお、私は特に卵や拡張ポイントの使用には踏み込みたくないのです。これはオープンソースのプロジェクトではないので、"プラグイン"があることを期待していません。ポイントは、メインアプリケーションのコードを簡素化し、新しいコマンドモジュールが追加されるたびにそれを修正する必要性をなくすことです。
解決するには?
2.7/3.1より古いPythonでは、かなりの確率でそのようになります。
新しいバージョンでは
importlib.import_module
に対して
Python 2
と
Python 3
.
を使用することができます。
exec
を使用することもできます。
または
__import__
というようにすると、モジュールの一覧をインポートすることができます。
>>> moduleNames = ['sys', 'os', 're', 'unittest']
>>> moduleNames
['sys', 'os', 're', 'unittest']
>>> modules = map(__import__, moduleNames)
より抜粋 Pythonに飛び込む .
関連
-
[解決済み] 文字列をfloatやintにパースするにはどうしたらいいですか?
-
[解決済み] Pythonで文字列の部分文字列を取得するにはどうすればよいですか?
-
[解決済み] Pythonで文字列を小文字にするには?
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み] フルパスでモジュールをインポートするには?
-
[解決済み] 他のPythonファイルをインポートするには?
-
[解決済み] Pythonモジュールをアンロード(再ロード)するにはどうしたらいいですか?
-
[解決済み] 同じディレクトリやサブディレクトリ内のクラスをインポートする方法は?
-
[解決済み] 相対パスからモジュールをインポートする
-
[解決済み] import module」または「from module import」を使用しますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
python call matlab メソッドの詳細
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
pythonサイクルタスクスケジューリングツール スケジュール詳解
-
Python 入出力と高次代入の基礎知識
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み】Python elifの構文が無効です【終了しました
-
[解決済み】Pythonでgoogle APIのJSONコードを読み込むとエラーになる件