You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何直接导入包内所有函数?解决嵌套调用问题

如何直接调用simupy包内模块的函数?

我懂你的需求——你现在用from simupy import *导入包后,还得通过blk.blk_func(val_param)这种方式调用模块里的函数,希望能直接用blk_func(val_param)来调用对吧?咱们只需要修改simupy/__init__.py的代码,把模块里的函数直接挂载到包的命名空间就行,具体操作如下:

修改__init__.py代码

替换你原来的__init__.py内容为下面这段:

import os
import importlib

dir_path = os.path.dirname(os.path.realpath(__file__))
file_lst = os.listdir(dir_path)
filename_lst = list(filter(lambda x: x[-3:] == '.py', file_lst))
filename_lst = list(map(lambda x: x[:-3], filename_lst))
filename_lst.remove('__init__')

__all__ = []
# 遍历每个模块,把成员导入到包的全局命名空间
for module_name in filename_lst:
    # 动态导入当前包下的模块
    module = importlib.import_module(f'.{module_name}', package=__name__)
    # 获取模块中需要暴露的成员:优先用模块自己定义的__all__,没有的话取非私有成员
    module_members = getattr(module, '__all__', [attr for attr in dir(module) if not attr.startswith('_')])
    # 将成员添加到包的命名空间,并更新__all__列表
    for member in module_members:
        globals()[member] = getattr(module, member)
        __all__.append(member)

代码解释

  • 原来的代码只是把模块名(比如blk、info)加入了__all__,所以from simupy import *导入的是模块对象,而不是模块里的函数。
  • 新代码用importlib动态导入每个模块,然后把模块里的成员(函数、变量等)直接放到包的全局命名空间里,同时更新__all__列表,这样from simupy import *就会把这些成员直接导入到你的test.py中。
  • 如果你的blk.py或info.py里定义了自己的__all__列表(比如blk.py里写__all__ = ['blk_func']),代码会优先遵循模块的定义,只导入指定的成员,这是更规范的做法。

测试使用

现在在test.py里写:

from simupy import *
# 直接调用函数就行
blk_func(val_param)

内容的提问来源于stack exchange,提问作者Tian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:09:12