1

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_modulesys.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() 

modulemodule2は実際に同じオブジェクトです。私の場合は、両方のプラグインが同じグローバル名を持つことができます(そしてそうする)ので、これは悪いことです。

私のアプリケーションのユーザは、プラグインファイルを読み込むパスのリストを指定できるので、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() 

インポート実際のモジュール名についてないケアにどのような方法がありますか?

+0

完全には分かりません)、複数の場所からの読み込みを許可していれば、これは不可能だと思います。モジュール間に依存関係はありますか? "/path/to/file.py" import "/path/to/file2.py"?注意してください、私はこのケースが仕事を得ることは不可能だと思います:-) – mkiever

答えて

0

モジュールをインポートするために、モジュール(プラグイン)を同時にバージョン管理することができます。もう1つの方法は、モジュールがあり、それらをソートする(何らかの種類のワークフローパターン)、存在する場合は重複を取り除くことです。 一般的に、輸入機械はあなたが望むものを気にするべきではありません!それは微妙なパターンであり、装填のためにハーネスを準備することを前提としています。 私はすべての私のアプリケーションで上記を持っており、私が望むものをロードする場所にすべての配線を得て、スペクトルは信じられないほどです。

関連する問題