gpt4 book ai didi

python - Subprocess.popen() 不能在 Windows 上的参数中使用引号

转载 作者:可可西里 更新时间:2023-11-01 14:43:46 37 4
gpt4 key购买 nike

我在 SO 上发表了一篇又一篇文章,寻找一种使用 subprocess.popen 在参数内部使用引号的方法,但我似乎找不到方法。

这在命令行下运行良好

runme.bat --include="check|check2"

python

#!/usr/bin/python
import sys
import subprocess
import shlex

#command_line = "./runme.sh --include=\"check|check2\""
command_line = "runme.bat --include=\"check|check2\""

arg = shlex.shlex(command_line)
arg.quotes = '"'
arg.whitespace_split = True
arg.commenters = ''
command_line_args = list(arg)
print command_line_args

command_line_process = subprocess.Popen(
command_line_args,
universal_newlines=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)

line = ""
while True:
line = command_line_process.stdout.readline()
if line:
print line
break

运行程序.bat

echo %* >> someargs.txt

runme.sh

#!/bin/bash
echo $@

我听说 subprocess.call() 是解决此问题的一种方法,但我希望能够在程序运行时逐行迭代子进程的输出。

编辑:

这似乎是 Python 中的一个错误,因为在 cmd 中运行 runme.bat 可以正常工作,在 linux 中运行 runme.py 可以正常工作,只有在 Windows 上运行 runme.py 时才能正常工作。我创建了一张票 here .

编辑2:

这显然不是 python 错误,哈哈。查看选择的答案。

最佳答案

在 Windows 上,字符串是 native API。为避免不必要的转换,请将命令作为字符串传递:

#!/usr/bin/env python
from __future__ import print_function
import subprocess

command = 'runme.bat --include="check|check2"'
process = subprocess.Popen(command,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
universal_newlines=True, bufsize=1)
for line in iter(process.stdout.readline, ''):
print(line, end='')

stderr=subprocess.STDOUT 将 stderr 合并到 stdout。如果您设置了 stderr=PIPE,那么您应该从 process.stderr 读取 parallel 并从 process.stdout 读取否则你的程序可能会死锁。

Popen() 将字符串传递给 CreateProcess() Windows 函数。如果子进程实际上是一个批处理文件;您可能应该显式传递 shell=True 以明确该命令是使用 cmd.exe 规则解释的 (^, | 等是元字符,更多详细信息read the links in this answer)。

如果您想使用 %1 而不是 %* 传递参数,以便它包含
整个 --include="check|check2"(不仅是 --include)然后你可以在参数周围使用额外的引号作为 @eryksun suggested in the comments :

command = '"runme.bat" "--include="check^^^|check2""'

注意:三重 ^ 在这里转义 |

关于python - Subprocess.popen() 不能在 Windows 上的参数中使用引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29434969/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com