使用Python命令行参数作为函数名称和函数值

时间:2015-04-24 17:56:43

标签: python-2.7 command-line-arguments

与此问题相关Command line arguments in python.

使用SYS模块,如何在我的代码中使用命令行参数作为函数名称和函数值 - 而无需导入其他模块?

我想要一个仅使用sys的解决方案。此外,请不要变长的params答案。那些令人困惑。假设在命令行中只指定了函数名和一个函数变量。

import sys

def reversal(aaa): return aaa[::-1]

a = sys.argv[1]
b = sys.argv[2]

print a(b)

在命令行

cpu_location$ python blah.py reversal 'abcdefg'

Traceback (most recent call last):
File "blah.py", line 8, in <module>
print a(b)
TypeError: 'str' object is not callable

我想知道如何将sys.argv [1]视为函数名,从而调用我定义的函数。

我在其中看到的其他帖子是混搭的: - 处理C / C ++并添加一些其他模块 - 根本不使用sys - 使用argv项作为函数的值和其他文件的名称,而不是函数的名称

3 个答案:

答案 0 :(得分:3)

eval解决方案更好:

a = globals()[sys.argv[1]]
a(b)

globals()返回一个字典,将全局变量名称映射到那些全局变量。因此globals()['reversal']会评估reversal函数。

eval功能更安全。通过您的方法,您可以执行以下操作:

python blah.py 'lambda x: x+"hi"' foobar

哪个会打印foobarhi,这是意料之外的,因为它不是函数名称。

答案 1 :(得分:1)

2小时后,我找到了答案。我认为以非常简单的方式发布它是值得的。

Basiclaly在Python中没有“函数”数据类型,但有人确实提到了内置的函数 eval Execute python commands passed as strings in command line using python -c(我自己的例子不需要-c)

解决方案是改变

a = sys.argv[1]

a = eval(sys.argv[1])

这将使传入的单词,反转,被评估。它将评估一个函数。然后a(b)调用将是对字符串的函数的完美调用,就像它的定义一样。输出将如下:

cpu_location$ python blah.py reversal unquoted
detouqnu

cpu_location$ python blah.py reversal 'withquotes'
setouqhtiw

答案 2 :(得分:0)

使用Google模块:火灾

pip install fire

这是一个简单的例子:

import fire

class Calculator(object):
  """A simple calculator class."""

  def double(self, number):
    return 2 * number

if __name__ == '__main__':
  fire.Fire(Calculator)

然后,从命令行运行:

python calculator.py double 10  # 20
python calculator.py double --number=15  # 30