Python从文件夹导入所有函数
我有一个包含各种Python文件的文件夹,每个文件都包含一些称为tasks的函数。我想做两件事: 而不是写作Python从文件夹导入所有函数,python,Python,我有一个包含各种Python文件的文件夹,每个文件都包含一些称为tasks的函数。我想做两件事: 而不是写作 from module.file1 import function1, function2 from module.file2 import function3 我更愿意做: from module import function1, function2, function3 除此之外,我还需要此目录中可用的所有函数名(如str)的列表(不包括内置函数) 到目前为止,我尝试编写了一个
from module.file1 import function1, function2
from module.file2 import function3
我更愿意做:
from module import function1, function2, function3
除此之外,我还需要此目录中可用的所有函数名(如str
)的列表(不包括内置函数)
到目前为止,我尝试编写了一个\uuuu init\uuuuu.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 = [getattr(m, f) for f in dir(m) if callable(getattr(m, f))]
我找到了解决的办法。
\uuuu init\uuuu.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]
m
是一个字符串,不是模块。感谢您的评论。将其更改为getattr(m,f)
会有所帮助,现在函数
包含很多东西。它包含了所有的内置函数,而不是我所希望的函数。你得到的实际上是str
的方法。为什么dir(m)
应该列出由路径标识的模块的属性,对吗?正如问题下已经指出的,m
是一个字符串,那么您希望dir(m)
返回什么?谢谢您的回答。将其更改为getattr(m,f)
会有所帮助,现在函数
包含很多东西。它确实包含了所有的内置函数,而不是我所希望的函数。它也没有解释问题的主要部分,即如何“返回”函数以便导入工作,以及如何获取函数的字符串列表。请参阅@Thierrylahuille注释,您可能应该确保使用的是模块,而不是字符串。