7

我想从脚本内部找出——我用来启动它的确切命令。我尝试了以下方法:

#!/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 被解析后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
4

2 回答 2

11

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

shell (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:]] )

它只是在所有参数周围添加引号。

于 2012-09-13T17:29:45.817 回答
7

我建议使用:

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

用于将list2cmdline参数列表转换为可在 shell 中使用的单个字符串。从文档:

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

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

2) 用双引号括起来的字符串被解释为单个参数,无论其中包含什么空格。带引号的字符串可以嵌入到参数中。

3) 前面有反斜杠的双引号被解释为文字双引号。

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

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

于 2012-09-13T18:02:11.687 回答