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)
但是 thenprogram.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
相应地使用,我仍然会被第二个参数中包含的双引号所困扰,这是不应该的。