Python 如何在没有任何shell脚本的情况下运行新进程并与其建立连接?

Python 如何在没有任何shell脚本的情况下运行新进程并与其建立连接?,python,linux,python-3.x,Python,Linux,Python 3.x,我的目的是创建其他程序的新进程,并与其建立长时间连接(有机会写入其stdin并读取结果),即不执行原子写-读操作,随后终止创建的进程。我只能使用程序代码,不能使用任何shell命令 这是我的代码: import subprocess proc = subprocess.Popen(['myprog', '-l'], shell = True, stdin = subprocess.PIPE, stdout = subprocess.PIPE) #proc was kept #after some

我的目的是创建其他程序的新进程,并与其建立长时间连接(有机会写入其stdin并读取结果),即不执行原子写-读操作,随后终止创建的进程。我只能使用程序代码,不能使用任何shell命令

这是我的代码:

import subprocess
proc = subprocess.Popen(['myprog', '-l'], shell = True, stdin = subprocess.PIPE, stdout = subprocess.PIPE)
#proc was kept
#after some waiting I try to send to proc some command
if proc.returncode == None:
    proc.stdin.write(b'command')
    response = process.communicate()[0]
此代码返回空字符串(如果提交了一个事务)或返回BrokenPipeError(如果它在循环中运行)。
在第一个
进程之后,proc是否保持活动状态。communicate()
?我需要使用什么方法来控制进程的stdin/stdout

您正在检查
proc.returncode==None

但是,如果您阅读了返回码,返回码可能是
0
或负数,但绝不是
None

  • 其次,如果您有长时间运行的进程,您应该调整并处理
    超时
    ,或者禁用它

  • 第三:在Popen中,您应该真正避免
    shell=True
    ,这是一个巨大的安全风险

以下是我通常如何处理Popen的一些示例:

from shlex import split as sh_split
from subprocess import PIPE, Popen, TimeoutExpired


def launch(command, cwd=None, stdin=None, timeout=15):
    with Popen(
        sh_split(command), universal_newlines=True,
        cwd=cwd, stdout=PIPE, stderr=PIPE, stdin=PIPE
    ) as proc:
        try:
            out, err = proc.communicate(input=stdin, timeout=timeout)
        except TimeoutExpired:
            proc.kill()
            out, err = proc.communicate()
        return proc.returncode, out.splitlines(), err.splitlines()
这是针对短期生命过程的,但我希望您能够了解stdin、stdout和stderr处理是如何完成的