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

xeufq47z  于 2023-10-23  发布在  Shell
关注(0)|答案(3)|浏览(150)

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

#!/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']

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

编辑

我用的是这个。我的脚本中的所有参数都有默认值,在用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
dy1byipe

dy1byipe1#

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

  • 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:]] )

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

2nbm6dog

2nbm6dog2#

我建议使用:

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

list2cmdline用于将参数列表转换为可从shell使用的单个字符串。来自doc:
使用与MS C运行时相同的规则,将参数序列转换为命令行字符串:
1)参数由白色空格分隔,空格或制表符。
2)由双引号括起的字符串被解释为单个参数,而不管其中是否包含白色空格。带引号的字符串可以嵌入到参数中。
3)前面有反斜杠的双引号被解释为文字双引号。
4)反斜杠按字面解释,除非它们紧跟着双引号。
5)如果反斜杠紧跟在双引号之前,则每对反斜杠都被解释为文字反斜杠。如果反斜杠的数目是奇数,则最后一个反斜杠将转义下一个双引号,如规则3所述。

3zwjbxry

3zwjbxry3#

这条线已经死了,但我昨天需要做这样的事情。我在AWS Workspaces上的windows/git-bash中工作,在不同的窗口中工作时,历史记录功能非常糟糕,我一直在丢失上下文,因为我写的一个python-fire工具每次调用都需要10-30个参数。我想保留执行的命令,因为它们可以作为我通过工具实现的基础设施的日志。我还希望最终结果比引用所有内容更具有可读性。我最终采取了一种蛮力方法,编写了相当数量的代码来构造一个合理的参数传真,当在命令行中复制和粘贴时,这些参数可以工作。
https://gist.github.com/cognitiaclaeves/2208ef31740384e39052d156728742d6

相关问题