【发布时间】:2019-01-25 18:12:40
【问题描述】:
我正在用 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
【问题讨论】:
-
保留原始参数是默认行为。你不需要做任何特别的事情,假设你不使用 shell(你为什么会呢?)。
-
对...所以你在做类似的事情:
subprocess.call([sys.argv[1], *sys.argv[1:], 'extra', 'arguments'])? -
像上面那样使用 subprocess.call 而不是处理字符串...那么您不必担心转义的东西...
-
您能否提供示例...您是说建议不起作用但您没有显示 1) 示例调用,2) 您的包装程序收到的内容或 3) 您如何'然后尝试添加参数并调用包装程序...
-
顺便说一句,使用 shell 脚本执行此操作很简单:
exec "$@" extra-args-here。为什么要使用 Python?
标签: python linux shell command-line-arguments