【发布时间】:2021-12-22 19:53:12
【问题描述】:
还有其他关于 SO 的问题接近回答我的问题,但我有一个非常具体的用例,但我无法解决。考虑一下:
from asyncio import create_subprocess_exec, run
async def main():
command = r'program.exe "C:\some folder" -o"\\server\share\some folder" "a \"quote\""'
proc = await create_subprocess_exec(*command)
await proc.wait()
run(main())
这会引起麻烦,因为program.exe 是用这些参数调用的:
['C:\\some folder', '-o\\server\\share\\some folder', 'a "quote"']
也就是说,双反斜杠不再存在,因为shlex.split() 将其删除。当然,我可以(正如其他答案所建议的那样)这样做:
proc = await create_subprocess_exec(*command, posix=False)
但随后program.exe 被这些参数有效地调用:
['"C:\\some folder"', '-o"\\\\server\\share\\some folder"', '"a \\"', 'quote\\""']
这也不好,因为现在双引号已经成为第一个参数内容的一部分,它们不属于它们,尽管第二个参数现在很好。第三个参数变得一团糟。
用正斜杠替换反斜杠,或用正则表达式删除引号都不起作用,原因类似。
有没有办法让shlex.split() 在服务器名称之前留下双反斜杠?还是根本没有?为什么它首先删除它们?
请注意,这些命令本身是完全有效的命令(无论如何分别在 Windows 和 Linux 上):
program.exe "C:\some folder" -o"\\server\share\some folder"
echo "hello \"world""
即使我确实检测到了操作系统并相应地使用了posix=True/False,我仍然会被第二个参数中包含的双引号所困扰,这是不应该的。
【问题讨论】: