在Python中使用字符串导入

2 投票
3 回答
2642 浏览
提问于 2025-04-17 04:26

简短版本:

假设我有一个字符串 str,还有一个文件 functions.py,我想从这个文件中导入一个方法,而这个方法的名字就存储在 str 里。

我该怎么做呢?我想要的效果是:

from functions.py import str

但是我希望能把 str 的内容解析出来,而不是导入名为 'str' 的方法(这个方法并不存在)。

经过一番搜索,我好像找到了一个接近的解决方案:

func_name = str
_tmp = __import__('functions.py', globals(), locals(), ['func_name'], -1)
func = ???? <what to put here?>

提前谢谢大家。

补充说明:信息有点多。

3 个回答

0

如果你的目标是通过只导入需要的函数来节省内存,那就别费心了;即使你使用了 from ... import ... 这种写法,Python 还是会把整个模块都导入进来,只不过它只会把你明确请求的那些成员添加到当前的字典中(其他的成员仍然在内存里,只是你不能直接访问它们)。

考虑到这一点,我会这样做:

import functions
the_name = self.name.lower() + str(i)
the_func = getattr(functions, the_name)
1

getattr 方法可以让你获取一个对象的属性。因为全局函数其实是它所在模块的属性,所以你可以这样使用:

import functions

funcName = 'doSomething'
f = getattr(functions, funcName)
f(123)

不需要使用 __import__,因为通常只有在你事先不知道模块名称的时候才需要用到它。

5

假设你把模块导入到_tmp的代码是可以正常运行的,那么最后一步就很简单了:

func = getattr(_tmp, func_name)

撰写回答