传递参数时如何调用保留引号?

时间:2019-07-13 09:46:58

标签: python bash command-line-interface command-line-arguments

我有一段看起来像这样的代码。实际的代码当然要长得多。我已将其简化以将其浓缩为想法。

tbb::task_group tg;
// Run parallel_for in background.
tg.run( [] { 
    tbb::parallel_for(...);
} );
// ...
// Any other code
// ...
tg.wait(); // task_group requires to call `wait` to guarantee that all tasks are really processed

预期输出:

#!/usr/bin/python

from sys import argv

class Base():
    def whoami(self):
        print(self.__class__.__name__)

    def foo(self, a, b):
        print(a+b)

class A(Base):
    def bar(self, a):
        print(a)

class B(Base):
    def fizz(self, a, b):
        print(a+b)

def main():
    eval(argv[1] + '().' + argv[2] + '(' + ', '.join(argv[3:]) + ')')

if __name__ == "__main__":
    main()

但是最后一行的实际输出是:

$ ./myScript.py A whoami
A
$ ./myScript.py B fizz 5 7
12
$ ./myScript.py B fizz '5' '7'
57

引号没有通过。我的目标是能够从命令行轻松调用各种类方法以进行调试。从一开始我就不知道我的方法是否错误。

是的,我知道$ ./myScript.py B fizz '5' '7' 12 带来的安全风险。我打算在代码投入生产时将其删除。

1 个答案:

答案 0 :(得分:3)

  

引号没有通过。我的目标是能够从命令行轻松调用各种类方法以进行调试。

引号不是您所使用的参数的一部分。引号由外壳解释。通常,引号用于为参数添加空格。

例如:

command foo bar

会将两个参数(foobar)传递给command,但是如果要添加空格,可以使用:

command 'foo bar'

现在,shell会将其解释为单个参数,并带有空格。

不过,您可以在参数中添加引号,例如:

command '"foo"' '"bar"'

或:

command "'foo'" "'bar'"

将带引号的值(第一个示例中的双引号"和第二个示例中的单引号')传递给命令。您也可以转义部分参数,例如command "\"Thank you\", she said.",从而在同一参数中使用双引号和单引号。

话虽如此,请不要使用eval(..)来评估字符串。 eval(..)具有严重的安全风险,有关更多信息,请参见Security of Python's eval() on untrusted strings?。您可以使用ast.literal_eval [python-doc]来评估文字。此外,您可以使用词典等将呼叫路由到正确的功能。