Aks*_*235 5 python bash subprocess
我正在尝试编写一个脚本,该脚本必须对某些bash命令进行大量调用,解析并处理输出,最后给出一些输出。
我正在使用subprocess.Popen和subprocess.call
如果我理解正确,那么这些方法将产生一个bah进程,运行命令,获取输出,然后终止该进程。
有没有办法让bash进程在后台连续运行,然后python调用可以直接进入该进程?这就像是bash作为服务器运行,而python调用了它。
我觉得这会优化通话,因为没有bash流程设置和拆卸。还是没有任何性能优势?
我觉得这会优化通话,因为没有bash流程设置和拆卸。
subprocess 除非您明确要求,否则从不运行外壳程序,例如,
#!/usr/bin/env python
import subprocess
subprocess.check_call(['ls', '-l'])
该调用ls无需调用即可运行程序/bin/sh。
还是没有任何性能优势?
如果您的子流程调用实际上使用外壳程序(例如,简洁地指定管道),或者您使用bash流程替换(可能很冗长且容易出错)subprocess直接使用模块进行定义,则调用不太可能bash成为性能瓶颈,请首先进行测量。
有一些Python包也允许非常方便地指定这样的命令,例如,plumbum可以用来模拟shell管道。
如果要bash用作服务器进程,则pexpect对于与外部进程进行基于对话框的交互非常有用-尽管不太可能影响时间性能。fabric允许同时运行本地和远程命令(ssh)。
还有其他的子包装诸如sarge其可以解析在一个字符串中指定的管道而不调用壳例如,它使为跨平台支持bash类似的语法(&&,||,&在命令行)或sh-一个完整的subprocess在Unix替换,其提供默认情况下,TTY(功能齐全,但类似shell的管道不太直接)。您甚至可以使用类似于Python的BASHwards外观语法来运行带有xonshShell的命令。同样,在大多数情况下,它不太可能以有意义的方式影响性能。
以可移植的方式启动和与外部进程进行通信的问题很复杂-进程,管道,tty,信号,线程,异步之间的交互。IO,在不同地方进行缓冲具有粗糙的边缘。如果您不知道特定的软件包如何解决与运行Shell命令有关的众多问题,那么引入新的软件包可能会使事情复杂化。
如果我理解正确,这些方法会生成一个 bah 进程,运行命令,获取输出,然后终止该进程。
subprocess.Popen涉及的有点多。它实际上创建了一个 I/O 线程来避免死锁。请参阅https://www.python.org/dev/peps/pep-0324/:
一种
communicate()方法,可以轻松发送stdin数据和读取stdout数据stderr,而不会有死锁的风险。大多数人都知道与子进程通信有关的流量控制问题,但并非所有人都有耐心或技能来编写完全正确且无死锁的选择循环。这意味着许多 Python 应用程序都包含竞争条件。communicate()标准库中的方法解决了这个问题。
有没有办法让 bash 进程在后台连续运行,然后 python 调用可以直接进入该进程?
当然,您仍然可以使用subprocess.Popen子进程并向子进程发送消息并接收返回的消息,而无需终止子进程。在最简单的情况下,您的消息可以是行。
当感兴趣的事件发生时,子流程可以继续向您发送消息,这允许请求-响应样式协议以及发布-订阅。