我想使用CPython C API将Python文件作为C应用程序的插件加载。那些Python文件包含类和其他东西,我知道如何获得那些一旦我有模块对象。
我必须导入Python文件并获取模块对象的当前解决方案是这样的(Python 3):
import importlib
module = importlib.machinery.SourceFileLoader('some_module', '/path/to/file.py').load_module()
我可以使用C API进行等效操作。
我的理解是模块对象也会被添加到sys.modules
字典中,并带有密钥some_module
。
我的问题是,如果我加载第二个模块,同时指定some_module
作为模块名称,则第二个模块中找到的名称将附加到与第一个模块相同的已加载模块中,现有名称为覆盖!也就是说,在这种情况下:
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文件可以位于不同的位置,这也意味着两个不同的插件可以具有相同的基本名称。
知道这一点,我是从路径创建唯一模块名称的唯一选择吗?然后最后一个例子变成:
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 :(得分:0)
您可以对模块(插件)进行并发版本控制以导入相同的模块。另一种方式是查询文件夹,其中模块是并对它们进行排序(某种工作流模式)并删除重复项(如果存在)。 一般来说,进口机械不应该关心你想要的东西!它是微观模式,并假设你准备装载线束。 我在我的所有应用程序中都有以上内容,并且喜欢这样的事实:我可以通过所有布线来加载我想要的频谱并且频谱令人难以置信,从命令行到完整的ML管道......