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

标签 python windows python-asyncio python-3.9

我需要从 Windows 上运行的 asyncio Python 程序调用子进程,如下所示:

process.exe -SomeNormalArg -SomeArgField="某些带空格的值"

我目前正在像这样运行它:

配置.json:

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

程序.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\""

我已阅读Converting an argument sequence to a string on Windows Python 文档中的一些内容,但我无法想出一种方法来完成这项工作。

我应该提到 create_subprocess_shell() 与命令函数的完整字符串作为解决方法,但这是一个困惑的解决方案。

最佳答案

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

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

如果您习惯于从 shell 启动程序,那么这似乎是违反直觉的,但否则它与您实际想要传递给子进程的内容完全匹配。 (子进程不会解析引号,shell 或 C 运行时会解析。)

关于python - Windows 中 asyncio.create_subprocess_exec() 参数中的引号和空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66430739/

相关文章:

windows - 在 Windows 7 上使用 emacs 运行其路径名中包含空格字符的进程

Go lang 中的 Python asyncio 事件循环等价物

Python 从同步函数运行非阻塞异步函数

python - PyCharm "no module named sys"

javascript - 为什么 "node.js/Crawler"无法在Windows上安装?

python - 为什么 PyCharm 单元测试发现不适用于目录?

Java 性能 Windows 与 Linux

python-3.x - 如何在 map 函数中使用 await

python - 在 Django 中使用 CBV 进行重定向

python - python 中的二维列表数组