首页 > 解决方案 > Python从文件夹中导入所有函数

问题描述

我有一个包含各种 Python 文件的文件夹,每个文件都包含一些称为任务的函数。我想做两件事:

而不是写

from module.file1 import function1, function2
from module.file2 import function3

我更愿意这样做:

from module import function1, function2, function3

除此之外,我需要str此目录中可用的所有函数名称(as)的列表(不包括内置函数)。

到目前为止,我尝试__init__.py使用以下内容编写一个:

from os.path import dirname, basename, isfile, join
import glob
modules = glob.glob(join(dirname(__file__), "*.py"))

functions = []

for m in modules:
    if isfile(m) and not m.endswith('__init__.py'):
        functions = [getattr(m, f) for f in dir(m) if callable(getattr(m, f))]

print(functions)

但是,functions现在包含所有内置功能,但不是正在寻找的功能。此外,如何“返回”要导入的函数以及如何获取函数名称列表(仅限字符串)以供进一步使用?

标签: python

解决方案


我找到了解决方法。

__init__.py看起来如下

__all__ = []

import pkgutil
import inspect

for loader, name, is_pkg in pkgutil.walk_packages(__path__):
    module = loader.find_module(name).load_module(name)

    for fname, value in inspect.getmembers(module, inspect.isfunction):
        if fname.startswith('__'):
            continue

        if value.__module__ != module.__name__:
            continue

        globals()[fname] = value
        __all__.append(fname)

它对模块名称进行额外检查,以确保我不列出导入的函数,而只列出模块中定义的函数。然后在另一个文件中包含它:

from tasks import __all__ as function_names
import tasks

functions = [getattr(tasks, f) for f in function_names]

推荐阅读