23

重複の可能性:
Python での動的モジュールのインポート

近いうちに一連のファイルを作成するつもりですが、それを整理する最善の方法は、リストを作成することです。そのリストはファイルの一番上にあり、その後、処理するコードがとんでもない量になります。そのリストが何を制御し、どのように動作するか。上記のリストを一度だけ書き込もうとしています。このリストは、次の形式のフォルダーとファイル名のリストです。

[(folder/filename, bool, bool, int), (folder/filename, bool, bool, int)]

ご覧のfolder/filenameとおり、同じです(一種)。ファイル名は.py末尾にフォルダ名が付いていますが、 import XXX を実行すると import XXX.py を実行する必要がないため、問題が発生することはないと思います。

私が直面している問題は、この方法を使用してインポートすることです...

for (testName, auto, hardware, bit) in testList:
    print(testName)
    paths = "\\" + testName
    print paths
    addpath(paths)
    sys.modules[testName] = testName # One of a few options I've seen suggested on the net
    print("Path Added")
    test = testName + ".Helloworld()"
    eval(test)

したがって、私が持っているテストごとに、名前を出力し、パスを含む文字列を組み立てます ( "\\testName")。この例では、テスト パスを出力し、パスをリストに追加します ( sys.path.append(path))。テストメインモジュールによって実行されeval、最終的に評価される文字列。

ご覧のとおり、現在、上部にインポートのリストを表示する必要があります。の内容と呼ばれるモジュールではなく、と呼ばれるモジュールを見つけようとするため、単純にインポートを行うことはできませんtestName(の内容は、インポートしたいモジュールの名前です) 。testNametestNametestName

これが行われた場所の例をいくつか見ましたが、私の状況で機能するものは見つかりません。誰かが文字通りそれを行うコードのチャンクを投げることができれば、それは素晴らしいことです.

また、eval を使用するためにハングアップしたり、描画したり、四分の一になったりしないように要求します。eval は非常に制御された環境で使用されます (循環するリストは .py ファイル内にあるため、「エンド ユーザー」は使用しないでください)。それを台無しにする)。

4

3 に答える 3

56

すべてを正しく理解したかどうかはわかりませんが、次を使用してモジュールを動的にインポートできます__import__

mod = __import__(testName)
mod.HelloWorld()

編集__import__:ユーザーコードのpythonドキュメントでの使用が推奨されていないことに気づきませんでした: __import__ドキュメント(Bakuriuが指摘したように)

これも機能するはずであり、より良いスタイルと見なされます。

import importlib

mod = importlib.import_module(testName)
mod.HelloWorld()
于 2012-12-28T14:45:20.267 に答える
22
  1. sys.modules自分が何をしているのか正確にわからない場合は、決して直接混乱することはありません。
  2. あなたがやりたいことをする方法はたくさんあります:
    1. 組み込み__import__関数
    2. 使用するimp.load_module
    3. 使用するimportlib.import_module

私は__import__直接使用することを避けて、行きますimportlib.import_module(これはのドキュメントの最後にも提案されています__import__)。

于 2012-12-28T14:47:01.827 に答える
2

モジュールが存在するパスを sys.path に追加します。モジュール名として文字列変数を受け入れる __import__ 関数を使用してモジュールをインポートします。

import sys
sys.path.insert(0, mypath)  # mypath = path of module to be imported
imported_module = __import__("string_module_name") # __import__ accepts string 
imported_module.myfunction()   # All symbols in mymodule are now available normally
于 2012-12-28T14:55:42.590 に答える