1.一般我们在python代码中要执行Linux命令行时,一般都会使用subprocess这个模块来做。
2.但是我们用subprocess执行大多数命令都是可以直接挂在后台执行的,也就是它的stdin参数可以直接指定一个管道 subprocess.PIPE ,也就是如下这样:

import subprocess
p = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

3.但是我们执行某些命令的时候,上面那句代码会提示:sudo: sorry, you must have a tty to run sudo,即我们的命令是sudo来运行的时候,有些操作系统上是运行直接后台直接运行的(如suse Linux,suse默认运行后台运行sudo),而有些Linux上则必须要我们开一个tty终端来运行(例如centos6、7,默认运行后台不允许运行sudo)。
4.当我们遇到了在后台不运行sudo时,也就是subprocess时提示sudo: sorry, you must have a tty to run sudo,这个时候我们有两种解决方案:

  • 我们可以去修改/etc/sudoers这个文件,将“Defaults requiretty”注释掉,此操作不需要重启服务,之后使用subprocess执行sudo时即可正常执行了
  • 上面那种做法或许只适合平时我们自己实验时使用,真正的生产环境中,一般不建议这么操作,这个时候我们可以使用python给我提供的一个名叫pty的模块来模拟开一个tty终端:
master, slave = pty.openpty()
proc = subprocess.Popen(cmd,
                        stdin=slave,
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE,
                        preexec_fn=os.setsid,
                        close_fds=True,
                        shell=True)
os.close(slave)

5.可以通过查看pty模块的源码可以知道其实pty中的openpty这个方法,底层是对os的openpty的一个扩展

def openpty():
    """openpty() -> (master_fd, slave_fd)
    Open a pty master/slave pair, using os.openpty() if possible."""
    try:
        return os.openpty()
    except (AttributeError, OSError):
    master_fd, slave_name = _open_terminal()
    slave_fd = slave_open(slave_name)
    return master_fd, slave_fd

参考1
参考2
参考3

此包提供了插入式替代subprocess.run捕获输出,同时还实时打印出来,就是这个样子tee一样。 对于仍执行长时间运行的子进程的任何工具而言,实时打印输出同时捕获仍然很重要,因为您可能不希望剥夺用户获得与正在发生的事情相关的即时反馈的权利。 # from subprocess import run from subprocess_tee import run result = run ( "echo 123" ) result . stdout == "123 \n " import subprocess     d = subprocess.Popen("sudo  -S chmod 777 /home/auto1/a.txt", stdin=subprocess.PIPE,                         stderr=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=Tru... 本来收集整理网络上相关资料后整理: 从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回值。 subprocess意在替代其他几个老的模块或者函数,比如:os.system os.spawn* os.popen* popen2.* commands.* 一、subprocess... 问题:在使用popen执行windows命令时候,出现无法执行问题,返回小包正常执行(如ipconfig),返回的大包(ipconfig/all)无法正常执行。 目前的解决措施:将popen.stderr代码调整到popen.stdout下面 1、无法执行的代码 import subprocess cmd = b'ipconfig/all' res = subprocess.Popen(cmd.... 1 os与commands模块​2 subprocess模块​3 subprocess.Popen类我们几乎可以在任何操作系统上通过命令行指令与操作系统进行交互,比如Linux平台下的shell。​​那么我们如何通过Python来完成这些命令行指令的执行呢?另外,我们应该知道的是命令行指令的​​执行通常有两个我们比较关注的结果:1 命令执行的状态码--表示命令执行是否成功​2 命令执行的输出结果-... p1=subprocess.run(stdout=subprocess.PIPE,....) P2=subprocess.run(input=p1.stdout,stdout=subprocess.PIPE) 然后实现的是: ls | grep之类的命令 然后同样忘了在哪看到的文章: 使用以下命令调用sudo的命令 os.system('echo %s | sudo -S %s ' %(sudoPassword,command)) 然后结合一下,就是我现在写的这个 password = '123123' command = 'cat /proc/cpuinfo' str = os.system('echo %s | sudo -S %s' % (password,command)) print(str) import subproc 在之前的文章中,实现了Electron-vue在不同系统打包成安装程序。但这只是前端build/package之后的文件打包,虽然服务端的编译之后的exe文件也可以放到一起打包,并且可以去启动服务端程序。然而不能与服务端通信的话,那么这个程序存在的意义就不大。所以在这片文章中会讲一下怎么在安装之后,启动应用程序调用服务端程序,同时获取服务端的输出值/返回值。 由于不是传统意义上的前后端通信(常见的前后端通信,只需要使用http/https进行通信即可,request发送请求,response返回请 subprocess – 创建附加进程 subprocess模块提供了一种一致的方法来创建和处理附加进程,与标准库中的其它模块相比,提供了一个更高级的接口。用于替换如下模块: os.system() , os.spawnv() , os和popen2模块中的popen()函数,以及 commands().subprocess模块,替换os.system等subprocess.run(['df','... import osimport subprocessfrom subprocess import Popen, PIPE# run the shell as a subprocess:cmd2 = "pint www.baidu.com"import osimport ptyimport selectfrom subprocess import Popen, STDOUTmaster_fd, sl... 本人在编写监控系统进程状态的脚本的时候,因为要涉及到调用系统命令查看linux系统进程pid以及时间等,所以使用到了os.popen().read()来获取返回值 然而调用命令发现无法获取到任何返回值,而直接在shell中执行实际上是存在进程的 原因是os.popen()中命令前需要加上sudo  还有一点需要注意,read()后的返回值,一般带有\n,容易出现类型错误,需要split('\...