加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 11:41:55 所属栏目:Python 来源:网络整理
导读:我在post上发帖后搜索了一个方法,使用subprocess.popen在参数内部使用引号,我似乎无法找到方法. 这可以从命令行正常工作 runme.bat --include="check|check2" Python #!/usr/bin/pythonimport sysimport subprocessimport shlex#command_line = "./runme.sh
我在post上发帖后搜索了一个方法,使用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

runme.bat

echo %* >> someargs.txt

runme.sh

#!/bin/bash
echo $@

我听说subprocess.call()是解决这个问题的方法,但是我希望能够在程序运行时逐行遍历子进程的输出.

编辑:

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

EDIT2:

这显然不是一个python bug大声笑.看看选择的答案.

解决方法

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

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

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

stderr = subprocess.STDOUT将stderr合并到stdout中.如果你设置了stderr = PIPE,那么你应该从process.stder读取并行读取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""'

注意:三重^逃脱|这里.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读