我想从脚本内部找出我用来启动它的确切命令。我尝试了以下方法:
#!/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
3条答案
按热度按时间dy1byipe1#
您正在查找的信息(命令参数包括引号)不可用。
查看详情
当你在shell中输入一个命令时,你可以使用引号来告诉 shell 你的命令行中的哪些标记可以作为一个参数来处理。空格用于将命令行分解为单个参数,引号用于覆盖它--将空格 * 包含在 * 参数中,而不是分隔参数。
然后,shell派生出可执行文件,并将参数列表传递给它。任何未加引号的引号都已经被shell在解析命令行时“用完”了,所以它们在这个阶段实际上不再存在,并且您的命令(python)看不到它们。
顺便说一句,我想知道你为什么关心得到报价。我不得不说,乍一看,这似乎是误导。如果你能告诉我们你为什么需要它们,也许我们能帮上忙?
编辑
为了回应OP下面的评论,这里有一种输出原始命令行的方法--或者至少是一种功能等效的方法:
它只是在所有参数周围添加引号。
2nbm6dog2#
我建议使用:
list2cmdline
用于将参数列表转换为可从shell使用的单个字符串。来自doc:使用与MS C运行时相同的规则,将参数序列转换为命令行字符串:
1)参数由白色空格分隔,空格或制表符。
2)由双引号括起的字符串被解释为单个参数,而不管其中是否包含白色空格。带引号的字符串可以嵌入到参数中。
3)前面有反斜杠的双引号被解释为文字双引号。
4)反斜杠按字面解释,除非它们紧跟着双引号。
5)如果反斜杠紧跟在双引号之前,则每对反斜杠都被解释为文字反斜杠。如果反斜杠的数目是奇数,则最后一个反斜杠将转义下一个双引号,如规则3所述。
3zwjbxry3#
这条线已经死了,但我昨天需要做这样的事情。我在AWS Workspaces上的windows/git-bash中工作,在不同的窗口中工作时,历史记录功能非常糟糕,我一直在丢失上下文,因为我写的一个python-fire工具每次调用都需要10-30个参数。我想保留执行的命令,因为它们可以作为我通过工具实现的基础设施的日志。我还希望最终结果比引用所有内容更具有可读性。我最终采取了一种蛮力方法,编写了相当数量的代码来构造一个合理的参数传真,当在命令行中复制和粘贴时,这些参数可以工作。
https://gist.github.com/cognitiaclaeves/2208ef31740384e39052d156728742d6