与此问题相关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项作为函数的值和其他文件的名称,而不是函数的名称
答案 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