簡體   English   中英

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\""
  ] 
}

程序.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 文檔中 Windows 位上的將參數序列轉換為字符串,但我想不出一種方法來完成這項工作。

我應該提到帶有完整命令字符串的create_subprocess_shell()作為一種解決方法,但它是一個混亂的解決方案。

你在過度引用。 -SomeArgField="Some Value with Spaces"中的引號僅用於防止 shell 通過空格分割參數,將其內容作為單獨的 arguments 傳遞給子進程。 由於您使用的create_subrocess_exec不是 go 到 shell,因此您一開始就沒有這個問題,也不需要引用:

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

如果您習慣於從 shell 啟動程序,這似乎違反直覺,但否則它與您實際想要傳遞給子進程的內容完全匹配。 (子進程不會解析引號,shell 或 C 運行時會這樣做。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM