gpt4 book ai didi

python - 在 Python 中创建匿名模块

转载 作者:行者123 更新时间:2023-11-28 20:52:21 29 4
gpt4 key购买 nike

编辑:我已经添加了一些关于我为什么要这样做的更多信息。

下面的示例代码仅用于示例目的。最后,我需要让我的代码遍历一个目录结构,当它找到一个 python 文件时,导入该文件以从中获取数据和可能的函数定义。然后将在确定如何处理目录中的剩余文件(HTML 模板等)时使用它

因为这个想法是让目录结构更适合保存 HTML 模板和图像,而 python 文件实际上更像是一个数据容器(尽管偶尔会有功能方面的逻辑),我不想到处都是 __init__.py 文件来确保 python 模块是包的一部分,我觉得搞乱 sys.path 是错误的解决方案(多个目录中可能有“meta.py”文件。

所以,我觉得通过源加载 python 文件是最好的解决方案。这个问题是我在下面显示的。

假设我有执行以下操作的代码:

主要.py:

import imp

a = imp.load_source('blah', 'a.py')
print dir(a)
b = imp.load_source('blah', 'b.py')
print dir(b)

a.py:

a = 'a'

b.py:

b = 'b'

运行main.py的结果是:

['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'a']
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'a', 'b']

我希望发生的是第二次调用 load_source 创建一个模块并返回它,但看起来它实际上会覆盖现有的。

目前,我的解决方案是将 load_source 函数中的“blah”字符串更改为这些模块都不会共享的某个名称(例如它们的文件名),但我想知道是否有更好的方法。

最佳答案

马克,据我所知你想知道,如果 imp.load_source() 可以导入一个名为“blah”的模块来覆盖之前的导入。嗯,你不能通过 imp.load_source() 做到这一点,原因如下:

看一段Python的import.c源码:

PyObject *
PyImport_ExecCodeModuleEx(char *name, PyObject *co, char *pathname)
{
PyObject *modules = PyImport_GetModuleDict();
PyObject *m, *d, *v;

m = PyImport_AddModule(name);
if (m == NULL)
return NULL;
/* If the module is being reloaded, we get the old module back
and re-use its dict to exec the new code. */
d = PyModule_GetDict(m);
if (PyDict_GetItemString(d, "__builtins__") == NULL) {
if (PyDict_SetItemString(d, "__builtins__",
PyEval_GetBuiltins()) != 0)
goto error;
}
...
...

您是否注意到有关重新加载模块的注释?因此,一种清晰且非 hackish 的方法来完成您的要求,即在导入 b.py 时使用另一个名称而不是“blah”。

关于python - 在 Python 中创建匿名模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6802986/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com