检查是否在多个脚本

时间:2016-08-23 09:28:56

标签: python

我有一个包含大量python脚本的python模块,我想阅读这些脚本并检查是否设置了变量。

我目前正在逐行阅读这些文件,但是我正在阅读的脚本是python,我猜有更好的方法吗?

for filename in glob.glob(os.path.join(my_path, '*.py')):
    with open(filename) as f:
        for line in f:
            if 'my_variable' in line:
                variable_exists = True

修改

我有一个包含很多类的目录,其中一些包含影响脚本运行方式的变量。 e.g。

class Script1():
    name = 'script1'
    countrys = ['US', 'UK', 'AU']

class Script2():
    name = 'script2'
    countrys = ['US', 'CA']

从此我想实现

[
    {'name': 'script1', 'country': 'US'},
    {'name': 'script1', 'country': 'UK'},
    {'name': 'script1', 'country': 'AU'},
    {'name': 'script2', 'country': 'US'},
    {'name': 'script2', 'country': 'CA'}
]

1 个答案:

答案 0 :(得分:1)

以下是您问题的工作示例:

import glob
import inspect
import os
import sys
import importlib


def get_classes(module):
    def pred(c):
        if inspect.isclass(c) and hasattr(c, "countrys"):
            return True
        return False

    for value in inspect.getmembers(module, pred):
        yield value


def list_plugins(search_paths, my_path):
    output = set()

    for path in search_paths:
        sys_path = list(sys.path)
        sys.path.insert(0, path)

        for f in glob.glob(my_path):
            print f
            location, ext = os.path.splitext(f)
            mod_name = os.path.basename(location)

            mod = importlib.import_module(mod_name)
            print os.path.abspath(mod.__file__)
            for c in get_classes(mod):
                output.add(c)

        sys.path[:] = sys_path

    return output


if __name__ == "__main__":
    output = []

    for p in list_plugins(["test"], os.path.join("test","*.py")):
        name, plugin = p[0], p[1]

        for c in plugin.countrys:
            output.append({
                'name': name,
                'country': c
            })

    print output

为了使其工作,有些评论在同一个脚本的名为test的文件夹中创建一个文件夹,其中包含一个空的__init__.py文件和一个(或多个)python文件,其中包含您在上面提到的类你的问题。

代码的重要部分是import_moduleinspect

的使用

这是一个小例子,但它应该是一个很好的起点。希望它有所帮助。