我想使用 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()
导入时有什么方法可以不关心实际的模块名称吗?