我在用python写包装器工具。该工具的调用如下:

<wrapper program> <actual program>  <arguments>


包装程序仅添加一个参数并执行实际程序:

<actual program> <arguments> <additional args added>


棘手的部分是,有些字符串已转义,有些未转义

Example arguments format: -d \"abc\"  -f "xyz"  "pqr" and more args


包装器工具是通用的,除了添加其他参数外,它不应该知道实际的程序和参数。

我了解这与外壳有关。关于如何实现包装器工具的任何建议。

我尝试通过转义所有“”来实现。在某些情况下,调用中不会转义“”,因此该工具无法正确执行实际程序。

是否可以保留用户提供的原始参数?

Wrapper.py来源:

import sys
import os
if __name__ == '__main__':
    cmd = sys.argv[1] + " "
    args = sys.argv[2:]
    args.insert(0, "test")
    cmd_string = cmd + " ".join(args)
    print("Executing:", cmd_string)
    os.system(cmd_string)


输出:

wrapper.py tool -d "abc" -f \"pqr\" 123
Executing: tool test -d abc -f "pqr" 123


预期执行:tool test -d "abc" -f \"pqr\" 123

最佳答案

在这里使用subprocess.call,然后您就不必处理字符串了/不必担心转义值等问题。

import sys
import subprocess
import random

subprocess.call([
    sys.argv[1], # the program to call
    *sys.argv[2:], # the original arguments to pass through
    # do extra args...
    '--some-argument', random.randint(1, 100),
    '--text-argument', 'some string with "quoted stuff"',
    '-o', 'string with no quoted stuff',
    'arg_x',
    'arg_y',
    # etc...
])


如果您在获得呼叫的标准输出之后,则可以使用result = subprocess.check_output(...)(或者也可以通过管道将被调用者的stderr传递给它),然后再检查结果...请注意,从3.5开始,还有一个更高的级别涵盖大多数用例的帮助程序subprocess.run

值得检查subprocess中的所有帮助器功能

10-08 05:23
查看更多