如何找到给Python的确切CLI命令?

Ado*_*obe 7 python unix shell command-line-arguments

我想从脚本里面找出 - 我用来启动它的确切命令.我尝试了以下方法:

#!/usr/bin/env python

import sys, os
print os.path.basename(sys.argv[0]), sys.argv[1:]
Run Code Online (Sandbox Code Playgroud)

但它失去了信息:

$ 1.py -1 dfd  'gf g' "df df"
1.py ['-1', 'dfd', 'gf g', 'df df']
Run Code Online (Sandbox Code Playgroud)

你看 - 它已经丢失了关于我使用双引号,单引号或根本没有引号的信息 - 在命令中.

编辑:

这就是我正在使用的.我脚本中的所有args都有默认值,并在使用以下方法解析args之后argparse:

args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

我记录它们或者如果有日志 - 覆盖它们:

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)
Run Code Online (Sandbox Code Playgroud)

提到的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
Run Code Online (Sandbox Code Playgroud)

ron*_*man 11

您正在寻找的信息(命令参数包括引号)不可用.

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

更多详情

在shell中键入命令时,可以使用引号告诉shell命令行上的哪些标记作为单个参数处理.空格用于将命令行分解为单个参数,引号用于覆盖 - 参数中包含空格而不是分隔参数.

然后shell分叉可执行文件并将参数列表传递给它.shell在解析命令行时已经"使用"了任何未加引号的引号,因此它们在此阶段实际上不再存在,并且您的命令(python)不会看到它们.


顺便说一句,我不得不想知道为什么你关心得到报价.我不得不说乍一看似乎是错误的.如果你告诉我们为什么你觉得你需要它们,我们可以提供帮助吗?

编辑

在下面的OP评论中,这是一种输出原始命令行的方法 - 或者至少一个在功能上等效的命令行:

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

它只是在所有参数周围加上引号.

  • @Adobe:这听起来像是一件非常非常难看的事情.你为什么需要这个? (4认同)

Pie*_* GM 5

我建议使用:

import subprocess, sys
print subprocess.list2cmdline(sys.argv[1:])
Run Code Online (Sandbox Code Playgroud)

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

使用与MS C运行时相同的规则,将参数序列转换为命令行字符串:

1)参数由空格分隔,空格可以是空格或制表符。

2)用双引号引起来的字符串被解释为单个参数,而不管其中包含的空格如何。可以将带引号的字符串嵌入参数中。

3)在双引号之前加反斜杠将被解释为文字双引号。

4)反斜杠按字面意义解释,除非它们直接在双引号之前。

5)如果反斜杠紧跟在双引号之前,则每对反斜杠都将被解释为文字反斜杠。如果反斜杠的数量为奇数,则最后一个反斜杠将按照规则3中的说明转义下一个双引号。