【问题标题】:Retrieving the cmd line arguments as it is in Python检索 Python 中的命令行参数
【发布时间】: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


【解决方案1】:

在此处使用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(...)(或者也将被调用者的标准错误传递给它)如果您想检查结果......请注意从 3.5 开始,还有另一个高级助手subprocess.run,涵盖了大多数用例。

值得一试subprocess中的所有辅助函数

【讨论】:

    猜你喜欢
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 2020-12-15
    • 2018-12-17
    • 2012-02-20
    • 1970-01-01
    • 2017-05-25
    相关资源
    最近更新 更多