通过命令行将值传入Python类

时间:2010-05-04 13:27:32

标签: python class command-line-arguments

我有一些代码可以从命令行将变量传入脚本。我可以将任何值传递给function var arg。问题是,当我将function放入类时,变量不会被读入function。脚本是:

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 个答案:

答案 0 :(得分:3)

您可能会发现getattr有用:

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


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

答案 1 :(得分:1)

听起来不是:

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

你想做的事情(如提到的@SilentGhost):

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

在类(而不是对象实例)上检索方法的棘手问题是,您将返回一个未绑定的方法。当你调用self.function时,你需要传递一个some_class实例作为第一个参数。

或者,如果您要定义相关类,可以使用classmethod或staticmethod来确保some_class.function_you_want_to_pick将返回绑定函数。