2010-05-04 10 views
3

J'ai un code pour transmettre une variable dans un script à partir de la ligne de commande. Je peux passer n'importe quelle valeur dans function pour l'argument var. Le problème est que lorsque je mets function dans une classe, la variable n'est pas lue dans function. Le script est:Passer une valeur dans la classe Python via la ligne de commande

import sys, os 

def function(var): 
    print var 

class function_call(object): 
    def __init__(self, sysArgs): 
     try: 
      self.function = None 
      self.args = [] 
      self.modulePath = sysArgs[0] 
      self.moduleDir, tail = os.path.split(self.modulePath) 
      self.moduleName, ext = os.path.splitext(tail) 
      __import__(self.moduleName) 
      self.module = sys.modules[self.moduleName] 
      if len(sysArgs) > 1: 
       self.functionName = sysArgs[1] 
       self.function = self.module.__dict__[self.functionName] 
       self.args = sysArgs[2:] 
     except Exception, e: 
      sys.stderr.write("%s %s\n" % ("PythonCall#__init__", e)) 

    def execute(self): 
     try: 
      if self.function: 
       self.function(*self.args) 
     except Exception, e: 
      sys.stderr.write("%s %s\n" % ("PythonCall#execute", e)) 

if __name__=="__main__": 
    function_call(sys.argv).execute() 

Cela fonctionne en entrant ./function <function> <arg1 arg2 ....>. Le problème est que je veux sélectionner la fonction que je veux qui est dans une classe plutôt que juste une fonction par elle-même. Le code que j'ai essayé est le même sauf que function(var): est dans une classe. J'espérais quelques idées sur la façon de modifier ma classe function_call pour l'accepter.

Si je veux transmettre la valeur Hello, je lance le script comme ceci - python function_call.py function Hello. Cela imprime ensuite la variable var en tant que Hello.

En entrant la variable dans les lignes de commande, je peux ensuite utiliser cette variable dans tout le code. Si le script était un tas de fonctions, je pouvais simplement sélectionner la fonction en utilisant ce code, mais je voudrais sélectionner les fonctions à l'intérieur d'une classe particulière. Au lieu de python function.py function hello je pourrais entrer dans la classe aussi, par exemple. python function.py A function hello.

J'ai également rencontré que j'ai un problème en enregistrant la valeur pour une utilisation en dehors de la fonction. Si quelqu'un pouvait résoudre cela, je l'apprécierais beaucoup. _________________________________________________________________________________

Code modifié. C'est le code qui fonctionne pour moi maintenant.

class A: 
    def __init__(self): 
     self.project = sys.argv[2] 
    def run(self, *sysArgs): 
     pass 
    def funct(self): 
     print self.project 

class function_call(object): 
    def __init__(self, sysArgs): 
     try: 
      self.function = None 
      self.args = [] 
      self.modulePath = sysArgs[0] 
      self.moduleDir, tail = os.path.split(self.modulePath) 
      self.moduleName, ext = os.path.splitext(tail) 
      __import__(self.moduleName) 
      self.module = sys.modules[self.moduleName] 
      if len(sysArgs) > 1: 
       self.functionName = sysArgs[1] 
       self.function = getattr(A(), sysArgs[1])(*sysArgs[2:]) 
       self.args = sysArgs[2:] 
     except Exception, e: 
      sys.stderr.write("%s %s\n" % ("PythonCall#__init__", e)) 

    def execute(self): 
     try: 
      if self.function: 
       self.function(*self.args) 
     except Exception, e: 
      sys.stderr.write("%s %s\n" % ("PythonCall#execute", e)) 


if __name__=="__main__": 
    function_call(sys.argv).execute() 
    inst_A = A() 
    inst_A.funct() 

Merci pour toute l'aide.

Répondre

2

vous trouverez peut-être utile getattr:

>>> argv = ['function.py', 'run', 'Hello'] 
>>> class A: 
    def run(self, *args): 
     print(*args) 


>>> getattr(A(), argv[1])(*argv[2:]) 
Hello 
+0

@SilentGhost - Si j'avais simplement une fonction comme 'def run' avec la variable' var', comment pourrais-je obtenir cet attribut d'une autre classe? Merci – chrissygormley

+0

@chriss: demandez-vous sur l'argument? vous pouvez simplement le passer dans l'appel normal (dernières parenthèses): 'getattr (A(), 'courir') ('arg1')' – SilentGhost

+0

@SilentGhost - +1 Merci pour cela mais je dois laisser la question ouverte comme cette réponse ne répond pas à la question sur la façon de passer l'argument de la ligne de commande dans cette classe. – chrissygormley

1

On dirait plutôt que:

self.function = self.module.__dict__[self.functionName] 

que vous voulez faire quelque chose comme (comme mentionné @SilentGhost):

self.function = getattr(some_class, self.functionName) 

La chose délicate avec la récupération d'une méthode sur une classe (pas une instance d'objet) est que vous êtes goi ng pour récupérer une méthode non liée. Vous devrez passer une instance de some_class comme premier argument lorsque vous appelez self.function.

Alternativement, si vous définissez la classe en question, vous pouvez utiliser classmethod ou staticmethod pour vous assurer que some_class.function_you_want_to_pick renverra une fonction liée.

+0

@Jeffrey Harris - +1, Merci – chrissygormley