Python 如何在没有任何shell脚本的情况下运行新进程并与其建立连接?
我的目的是创建其他程序的新进程,并与其建立长时间连接(有机会写入其stdin并读取结果),即不执行原子写-读操作,随后终止创建的进程。我只能使用程序代码,不能使用任何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
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
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处理是如何完成的