如何找到给Python的确切CLI命令?(How do I find the exact CLI c

2019-09-22 09:55发布

我想从脚本中找到 - 我用火起来的确切命令。 我试过如下:

#!/usr/bin/env python

import sys, os
print os.path.basename(sys.argv[0]), sys.argv[1:]

但它失去了信息:

$ 1.py -1 dfd  'gf g' "df df"
1.py ['-1', 'dfd', 'gf g', 'df df']

你看 - 它已经失去了作为信息我用双引号,单引号或没有出现过报价都枯萎 - 在命令。

编辑

下面是我使用的是什么。 在我的脚本所有ARGS都有默认值,之后ARG游戏与解析argparse

args = parser.parse_args()

我记录他们,或者如果有一个记录 - 覆盖它们:

logName = "." + (os.path.splitext(os.path.basename(sys.argv[0])))[0] + ".json"
if os.path.exists(logName):
    print "!!! I've found log", logName
    Args = bk_loads_json(logName)
    for arg in Args:
        exec('args.{0} = Args["{0}"]'.format(arg))
else:
    print "!!! the log of args is saved to", logName
    bk_saves_json(args.__dict__, logName)

defuns提到:

def bk_saves_json(myCustomDct, flNm):
    "Takes dict, and writes it to the file."

    FlNm = open(flNm, 'w')
    tmpJsn = json.dumps(myCustomDct, sort_keys=True, indent=4)
    FlNm.write(tmpJsn)
    FlNm.close()

def bk_loads_json(flNm):
    "Takes file of the json and returns it as a dict."

    json_data=open(flNm)
    data = json.load(json_data)
    json_data.close()
    return data

Answer 1:

你正在寻找(命令PARAMS包括引号)的信息不可用。

(bash)的,而不是Python,读取并解释报价-由时间Python或任何其他衍生程序看到参数,引号被除去。 (除报价报价,当然。)

更多详情

当你输入一个命令到外壳,您使用引号来告诉令牌你的命令行上当作一个参数的外壳 。 空白是用来打破你的命令行成单独的参数,可以和引号用于覆盖-包括一个参数,而不是内部的分隔参数空白。

然后shell叉可执行文件,并传递给它的参数列表。 任何不带引号的报价已经被“用完”中,通过命令行的解析外壳,使他们有效地不再在这个阶段存在,你的命令(蟒蛇)不会看到它们。


顺便说一句,我想知道你为什么在乎得到报价。 我不得不说,在乍看之下,似乎误导。 或许,如果你告诉我们,为什么你觉得你需要他们,我们可以帮助?

编辑

在respose低于OP的评论,这里有一个方法来输出的原始命令行 - 或者至少一个是功能上等同:

import pipes # or shlex if python3
print sys.argv[0], ' '.join( [pipes.quote(s) for s in sys.argv[1:]] )

它只是增加了周围的所有PARAMS报价。



Answer 2:

我会建议使用:

import subprocess, sys
print subprocess.list2cmdline(sys.argv[1:])

所述list2cmdline用于转化的参数列表到从壳可用一个字符串。 从文档:

翻译的参数的序列到命令行串,使用同样的规则作为MS C运行时:

1)参数是由白色的空间,这可以是一个空间或制表符分隔。

2)由双引号所包围的字符串被解释为一个参数,而不论包含在白空间。 带引号的字符串可以嵌入在争吵。

3)由反斜杠一个双引号被解释为一个字面双引号。

4)反斜杠按其原义解释,除非它们紧位于双引号。

5)如果反斜杠立即之前一个双引号,每对反斜线被解释为一个反斜杠。 如果反斜线数量为奇数,如在规则3中记述的最后一个反斜杠转义下一个双引号。



文章来源: How do I find the exact CLI command given to Python?