2010-05-04 2 views
3

У меня есть код для передачи переменной в скрипт из командной строки. Я могу передать любое значение в function для var arg. Проблема в том, что когда я кладу function в класс, переменная не считывается в function. Сценарий:Передайте значение в класс Python через командную строку

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() 

Это работает путем ввода ./function <function> <arg1 arg2 ....>. Проблема в том, что я хочу выбрать функцию, которую я хочу, которая находится в классе, а не только сама по себе функция. Код, который я пытался, тот же, за исключением того, что function(var): находится в классе. Я надеялся на некоторые идеи о том, как изменить класс function_call, чтобы принять это.

Если я хочу передать значение Hello Я запустил сценарий так - python function_call.py function Hello. Затем он печатает переменную var как Hello.

Вводя переменную в командные строки, я могу использовать эту переменную во всем коде. Если скрипт был набором функций, я мог бы просто выбрать функцию с помощью этого кода, но я хотел бы выбрать функции внутри определенного класса. Вместо python function.py function hello я мог бы ввести класс, например, например. python function.py A function hello.

Также у меня есть проблема с тем, что у меня проблема с сохранением значения для использования вне функции. Если бы кто-нибудь мог это решить, я был бы очень признателен. _________________________________________________________________________________

Измененный код. Это код, который работает для меня сейчас.

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() 

Спасибо за помощь.

ответ

2

вы можете найти getattr полезно:

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


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

@SilentGhost - Если бы у меня была функция 'def run' с переменной' var', как я мог бы получить этот атрибут из другого класса? Спасибо – chrissygormley

+0

@chriss: вы спрашиваете о аргументе? вы можете просто передать его в обычном вызове (последние скобки): 'getattr (A(), 'run') ('arg1')' – SilentGhost

+0

@SilentGhost - +1 Спасибо за это, но я должен оставить вопрос открытым как этот ответ не отвечает на вопрос о том, как передать arg из командной строки в этом классе. – chrissygormley

1

Это походит скорее, чем:

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

вы хотите сделать что-то подобное (как упомянуто @SilentGhost):

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

Трудная вещь с извлечением метода в классе (а не в экземпляре объекта) заключается в том, что вы goi ng, чтобы вернуть несвязанный метод. Вам нужно будет передать экземпляр some_class в качестве первого аргумента, когда вы вызываете self.function.

В качестве альтернативы, если вы определяете класс, о котором идет речь, вы можете использовать classmethod или staticmethod, чтобы убедиться, что some_class.function_you_want_to_pick вернет связанную функцию.

+0

@Jeffrey Harris - +1, Спасибо – chrissygormley

Смежные вопросы