Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/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脚本的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:

我有一个包含大量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

从这一点上我想实现

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

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

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
的文件夹,其中包含一个空的
\uuuu init\uuuuuy.py
文件和一个(或多个)python文件,其中包含您在问题中提到的类

代码的重要部分是和的用法


这是一个小例子,但对你来说应该是一个很好的起点。希望有帮助。

您可以使用、逐个导入脚本并检查变量的定义。如果这太脏了,用
ast.parse
解析它们,然后递归地检查整个树。是否要检查是否可以在代码的任何部分设置变量?是否可以接触到该部件?如果在执行时能达到这个目标?了解这里的推理会很有趣,因为我怀疑有一些事情可以做得更好,或者以不同的方式开始,但是@L3viathan对
importlib
的建议就是我要做的,如果你问的是我确实需要做的事情。@kungpu我在这个问题上添加了更多的例子。我希望这有助于解释我试图实现的目标。您在示例中使用的
name
country
项不是变量,而是属性。这就是你真正的意思吗?@RoryDaulton是的。我想从这些文件中获得更多信息,但只是尽量简化示例,以便能够解决其余问题。@lennard,不客气:),问题非常有趣,顺便说一句,+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