Windows 中 asyncio.create_subprocess_exec() 的参数中的引号和空格
Quotes and spaces in an argument to asyncio.create_subprocess_exec() in Windows
我需要在 Windows 上从 asyncio Python 程序 运行 调用一个子进程:
process.exe -SomeNormalArg -SomeArgField="Some Value with Spaces"
我目前运行是这样的:
config.json:
{
"args": [
"-SomeNormalArg",
"-SomeArgField=\"Some Value with Spaces\""
]
}
program.py:
#!/usr/bin/env python3
import asyncio
import json
args = loads(open('config.json').read())['args']
async def main():
await asyncio.create_subprocess_exec('process.exe', *args)
if __name__ == '__main__':
asyncio.run(main())
...但是进程正在生成 process.exe -SomeNormalArg "-SomeArgField=\"Some Value with Spaces\""
。
我已经阅读了 Python 文档中的 Converting an argument sequence to a string on Windows 位,但我无法想出一种方法来完成这项工作。
我应该提一下 create_subprocess_shell()
使用完整的命令字符串作为解决方法,但这是一个混乱的解决方案。
你多引用了。 -SomeArgField="Some Value with Spaces"
中的引号仅用于防止 shell 用空格拆分参数,将其内容作为单独的参数传递给子进程。由于您使用的 create_subrocess_exec
没有经过 shell,因此您一开始就没有这个问题,根本不需要引用:
{
"args": [
"-SomeNormalArg",
"-SomeArgField=Some Value with Spaces"
]
}
如果您习惯于从 shell 启动程序,这似乎违反直觉,但除此之外它与您实际想要传递给子进程的内容完全匹配。 (子进程不会解析引号,shell 或 C 运行时会解析。)
我需要在 Windows 上从 asyncio Python 程序 运行 调用一个子进程:
process.exe -SomeNormalArg -SomeArgField="Some Value with Spaces"
我目前运行是这样的:
config.json:
{
"args": [
"-SomeNormalArg",
"-SomeArgField=\"Some Value with Spaces\""
]
}
program.py:
#!/usr/bin/env python3
import asyncio
import json
args = loads(open('config.json').read())['args']
async def main():
await asyncio.create_subprocess_exec('process.exe', *args)
if __name__ == '__main__':
asyncio.run(main())
...但是进程正在生成 process.exe -SomeNormalArg "-SomeArgField=\"Some Value with Spaces\""
。
我已经阅读了 Python 文档中的 Converting an argument sequence to a string on Windows 位,但我无法想出一种方法来完成这项工作。
我应该提一下 create_subprocess_shell()
使用完整的命令字符串作为解决方法,但这是一个混乱的解决方案。
你多引用了。 -SomeArgField="Some Value with Spaces"
中的引号仅用于防止 shell 用空格拆分参数,将其内容作为单独的参数传递给子进程。由于您使用的 create_subrocess_exec
没有经过 shell,因此您一开始就没有这个问题,根本不需要引用:
{
"args": [
"-SomeNormalArg",
"-SomeArgField=Some Value with Spaces"
]
}
如果您习惯于从 shell 启动程序,这似乎违反直觉,但除此之外它与您实际想要传递给子进程的内容完全匹配。 (子进程不会解析引号,shell 或 C 运行时会解析。)