我用subprocess模块调用不同的进程.但是,我有一个问题.
在以下代码中:
callProcess = subprocess.Popen(['ls', '-l'], shell=True)
和
callProcess = subprocess.Popen(['ls', '-l']) # without shell
两者都有效.阅读文档后,我开始知道这shell=True意味着通过shell执行代码.这意味着在缺席的情况下,该过程将直接启动.
那么我应该更喜欢我的情况 - 我需要运行一个进程并获得其输出.从shell内部或外部调用它有什么好处.
我在 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
运行文件
echo %* >> someargs.txt
runme.sh
#!/bin/bash
echo $@
我听说 subprocess.call() 是解决这个问题的方法,但我希望能够在程序运行时逐行迭代子进程的输出。
编辑:
这似乎是Python中的一个错误,因为在cmd中运行runme.bat可以正常工作,在linux中运行runme.py可以正常工作,只有在Windows上运行runme.py时才能正常工作。我在这里创建了一张票。 …