python - 从模块中导入带有其名称的子模块

标签 python python-import

我在子模块 db.db_1 中有一个名为 prepared_db 的函数:

from spam import db

submodule_name = "db_1"
func_name = "prepare_db"
func = ...

如何通过上面上下文中的子模块名称和函数名称获取函数?

更新:

为了回应@histrio 的回答,我可以验证他的代码是否适用于os 模块。但在这种情况下不起作用。要创建示例:

$ mkdir -p spam/db
$ cat > spam/db/db_1.py
def prepare_db():
    print('prepare_db func')
$ touch spam/db/__init__.py
$ PYTHONPATH=$PYTHONPATH:spam

现在,你可以正常导入了:

>>> from spam.db.db_1 import prepare_db
>>> prepare_db()
prepare_db func

但是如果你动态地这样做,我会得到这个错误:

>>> getattr(getattr(db, submodule_name), func_name)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-9-1b6aa1216551> in <module>()
----> 1 getattr(getattr(db, submodule_name), func_name)

AttributeError: module 'spam.db.db_1' has no attribute 'prepared_db'

最佳答案

很简单。您可以将模块视为对象。

import os

submodule_name = "path"
func_name = "exists"

submodule = getattr(os, submodule_name)
function = getattr(submodule, func_name)
function('/home') # True

或者[只是为了好玩,不要那样做]

fn = reduce(getattr, ('sub1', 'sub2', 'sub3', 'fn'), module)

更新

import importlib
submodule = importlib.import_module('.'+submodule_name, module.__name__)
function = getattr(submodule, func_name)

关于python - 从模块中导入带有其名称的子模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34939762/

相关文章:

c++ - 为什么 std::string 操作表现不佳?

Python 'called with the wrong argument type' 错误

python - 从兄弟目录导入模块以与 py.test 一起使用

python - django 休息框架断言错误

python - 如何在 Django 应用程序中对访问次数进行排序?

Python:sys.path.append 与 import?

python - 名称错误 : name 'requests' is not defined

python - Python Flask 中的相对导入似乎不起作用

python - 如何在预提交 git hook 上运行 python 包

python - 从不同的文件夹导入python中的模块