2016-08-23 1 views
3

J'ai un module python avec beaucoup de scripts python, je veux lire ces scripts et vérifier si une variable est définie.Vérifiez si la variable est définie dans plusieurs scripts

Je suis en train de lire les fichiers ligne par ligne, mais comme les scripts que je suis en train de lire sont en python, je suppose qu'il y a un meilleur moyen?

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 

Modifier

J'ai un répertoire qui a beaucoup de classes, certains ont des variables qui influent sur la façon dont le script est exécuté. par exemple.

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

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

A partir de ce que je veux obtenir

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

Vous pouvez utiliser ['importlib'] (https://docs.python.org/3/library/importlib.html), importer les scripts un par un et vérifier la définition de la variable. Si c'est trop sale, les analyser avec ast.parse et vérifier récursivement l'arbre entier. Voulez-vous vérifier s'il est possible que la variable puisse être définie dans n'importe quelle partie du code? Si cette partie est accessible? Si ce sera atteint lors de l'exécution? – L3viathan

+1

Il serait intéressant de connaître le raisonnement ici, parce que je soupçonne qu'il y a quelque chose qui pourrait être fait mieux ou d'une autre manière, mais ce que L3viathan suggère avec 'importlib', c'est ce que je ferais, si vous demandez est ce que je devais absolument faire. – kungphu

+0

@kungphu J'ai ajouté plus d'un exemple à la question. J'espère que cela aide à expliquer ce que j'essaie d'accomplir. – lennard

Répondre

1

Voici un exemple de travail pour votre question:

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 

Certains commentaires, pour le faire fonctionner, créez un dossier dans ce le même script dossier test contenant un fichier vide __init__.py et un (ou plusieurs) fichier python avec les classes que vous avez mentionnées dans votre question.

Les bits importants du code sont l'utilisation de import_module et inspect

Il est un petit exemple, mais il devrait être un bon point de départ pour vous. J'espère que cela aide.

+0

Un grand merci. Exactement ce que je cherchais. – lennard

+1

@ lennard Vous êtes les bienvenus :), la question était très intéressante, +1. – BPL