1

我想使用 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带有 key 的字典中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()

导入时有什么方法可以关心实际的模块名称吗?

4

1 回答 1

0

您可以对模块(插件)进行并发版本控制以导入相同的版本。另一种方法是查询模块所在的文件夹并对它们进行排序(某种工作流模式)并删除重复项(如果存在)。一般来说进口机械不应该关心你想要什么!它是微模式,假设您将准备好安全带进行装载。我在所有应用程序中都拥有上述优势,并且喜欢这样一个事实,即我将所有布线都安装到位以加载我想要的任何东西,并且频谱令人难以置信,从命令行到完整的 ML 管道......

于 2017-11-02T16:34:22.827 回答