CPython C APIを使用してPythonファイルをCアプリケーションのプラグインとして読み込みたいとします。これらのPythonファイルにはクラスやその他のものが含まれており、モジュールオブジェクトを取得したらそれらを取得する方法を知っています。importlib:モジュール名を気にせずに複数のPythonファイルをインポートする方法
import importlib
module = importlib.machinery.SourceFileLoader('some_module', '/path/to/file.py').load_module()
は、私はCのAPIと同等の操作を行うことができます。
私はPythonのファイルをインポートし、モジュールオブジェクトを取得する必要があり、現在のソリューションは、この(Pythonの3)です。
私が理解しているのは、モジュールオブジェクトもsome_module
のsys.modules
辞書に追加されていることです。
私の問題は、モジュール名にsome_module
を指定して2番目のモジュールをロードすると、2番目のモジュールで見つかった名前が最初のものと同じ読み込み済みモジュールに追加され、既存の名前が上書きされることです。すなわち、この場合には、次のとおりです。
import importlib
module = importlib.machinery.SourceFileLoader('some_module', '/path/to/file.py').load_module()
module2 = importlib.machinery.SourceFileLoader('some_module', '/path/to/file2.py').load_module()
module
とmodule2
は実際に同じオブジェクトです。私の場合は、両方のプラグインが同じグローバル名を持つことができます(そしてそうする)ので、これは悪いことです。
私のアプリケーションのユーザは、プラグインファイルを読み込むパスのリストを指定できるので、Pythonファイルを別の場所に置くことができます。つまり、2つの異なるプラグインが同じベース名を持つこともできます。
これを知っているのは、パスから一意のモジュール名を作成する私の唯一の選択肢ですか?そして、最後の例は次のようになります。
import importlib
module = importlib.machinery.SourceFileLoader('path_to_file', '/path/to/file.py').load_module()
module2 = importlib.machinery.SourceFileLoader('path_to_file2', '/path/to/file2.py').load_module()
インポート実際のモジュール名についてないケアにどのような方法がありますか?
完全には分かりません)、複数の場所からの読み込みを許可していれば、これは不可能だと思います。モジュール間に依存関係はありますか? "/path/to/file.py" import "/path/to/file2.py"?注意してください、私はこのケースが仕事を得ることは不可能だと思います:-) – mkiever