有没有办法在python中执行文件中的所有函数而不显式调用它们?

时间:2015-02-21 07:58:02

标签: python

是否有库或python魔法允许我在文件中执行所有函数而不显式调用它们。与pytest正在做的非常类似的事情 - 运行以' test _...'开头的所有函数。没有在任何地方注册它们。

例如假设我有一个文件a.py:

def f1():
    print "f1"

def f2():
    print "f2"

并假设我有文件 - 我的主文件 - main.py:

if __name__ == '__main__':
    some_magic()

所以当我打电话时:

python main.py

输出结果为:

f1
f2

3 个答案:

答案 0 :(得分:11)

这是一种方式:

def some_magic():
    import a
    for i in dir(a):
        item = getattr(a,i)
        if callable(item):
            item()

if __name__ == '__main__':
    some_magic()

dir(a)检索模块a的所有属性。如果属性是可调用对象,则调用它。这将调用所有可调用的内容,因此您可能希望使用and i.startswith('f')对其进行限定。

答案 1 :(得分:0)

这是另一种方式:

#!/usr/local/bin/python3
import inspect
import sys


def f1():
    print("f1")


def f2():
    print("f2")


def some_magic(mod):
    all_functions = inspect.getmembers(mod, inspect.isfunction)
    for key, value in all_functions:
        if str(inspect.signature(value)) == "()":
            value()

if __name__ == '__main__':
    some_magic(sys.modules[__name__])

它只会通过使用inspect.signature(function)来调用没有任何参数的函数。

答案 2 :(得分:0)

你试过callifile吗?

pip install callifile

然后,在您的文件中:

from callifile.callifile import callifile as callifile
import sys

callifile(module=sys.modules[__name__], verbose=True)

自给自足的例子:

在文件 some_callify.py

from callifile.callifile import callifile as callifile
import sys

def f_1():
    print "bla"

callifile(module=sys.modules[__name__], verbose=True)

呼叫终端:

python some_callify.py

给我终端输出:

Apply call_all_function_in_this_file on <module '__main__' from 'some_callify.py'>
See if should call callifile
See if should call f_1
Call f_1
bla