我想从脚本里面找到 - 我用来启动它的确切命令。我尝试了以下方法:
#!/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之后:
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)
defumns提到:
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
答案 0 :(得分:10)
您正在寻找的信息(命令参数包括引号)不可用。
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:]] )
它只是在所有参数周围加上引号。
答案 1 :(得分:4)
我建议使用:
import subprocess, sys
print subprocess.list2cmdline(sys.argv[1:])
list2cmdline
用于将参数列表转换为可从shell使用的单个字符串。来自doc:
将一系列参数转换为命令行 字符串,使用与MS C运行时相同的规则:
1)参数由空格分隔,即空格 空格或标签。
2)用双引号括起来的字符串是 无论空格如何,都被解释为单个参数 包含在内。带引号的字符串可以嵌入到 参数。
3)以反斜杠开头的双引号是 被解释为文字双引号。
4)反斜率按字面解释,除非它们 紧接在双引号之前。
5)如果反斜杠紧跟在双引号之前, 每对反斜杠都被解释为文字 反斜杠。如果反斜杠的数量是奇数,则是最后一个 反斜杠将下一个双引号转义为 在规则3中描述。