asyncio.create_subprocess_exec()的参数中的引号和空格

2024-10-01 04:58:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要从运行在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()使用完整的命令字符串作为一种解决方法,但这是一个混乱的解决方案


Tags: importasyncioconfigjsonvaluemainwindowswith
1条回答
网友
1楼 · 发布于 2024-10-01 04:58:27

你的报价太高了。-SomeArgField="Some Value with Spaces"中的引号仅用于防止shell通过空格分割参数,将其内容作为单独的参数传递给子流程。由于您使用的create_subrocess_exec不经过shell,因此您一开始就没有这个问题,并且根本不需要引用:

{
  "args": [
    "-SomeNormalArg",
    "-SomeArgField=Some Value with Spaces"
  ] 
}

如果您习惯于从shell启动程序,那么这似乎是违反直觉的,但在其他方面,它与您实际希望传递给子流程的内容完全匹配。(子流程不会解析引号,shell或C运行时会这样做。)

相关问题 更多 >