Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python从文件夹导入所有函数_Python - Fatal编程技术网

Python从文件夹导入所有函数

Python从文件夹导入所有函数,python,Python,我有一个包含各种Python文件的文件夹,每个文件都包含一些称为tasks的函数。我想做两件事: 而不是写作 from module.file1 import function1, function2 from module.file2 import function3 我更愿意做: from module import function1, function2, function3 除此之外,我还需要此目录中可用的所有函数名(如str)的列表(不包括内置函数) 到目前为止,我尝试编写了一个

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

而不是写作

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注释,您可能应该确保使用的是模块,而不是字符串。