微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python脚本和linux shell之间的交互

我有一个Python脚本,需要通过命令行与用户进行交互,同时logging输出内容

我目前有这样的:

# lots of code popen = subprocess.Popen( args,shell=True,stdin=sys.stdin,stdout=sys.stdout,stderr=sys.stdout,executable='/bin/bash') popen.communicate() # more code

这就像在terminal中inputshell命令一样执行shell命令(例如adduser newuser02),包括交互行为。 这很好。

现在,我想从Python脚本中logging出现在屏幕上的所有内容。 但我似乎无法使这部分工作。

如何从Windows上的CMD中的任何位置调用.bat文件

在命令行输出中searchstring

Tomcat:“CATALINA_HOME环境variables未正确定义”

改变目录停止%〜dp0工作

为什么我的gdb提示在改变颜色后显示错误

我已经尝试了使用subprocess.PIPE的各种方法,但是这通常会使交互性紊乱,就像不输出提示string一样。

我也尝试过不同的方法来直接改变sys.stdout的行为,但是当subprocess直接写入sys.stdout.fileno()时,这一切都没有用。

使用命令行更改键盘input

如何根据条件格式化我的zsh提示符?

使用java的特定提示命令

命令提示符在wshShell.Run上打开多个窗口

如何在Windows中更改命令行提示符?

由于缓冲问题以及由于某些程序直接从终端写/读,例如检索密码, Popen可能不太适合用于交互式程序。 Q:为什么不使用管道(popen())? 。

如果您想模拟script实用程序,那么您可以使用pty.spawn() ,参见从Python子流程中复制终端输出中的代码示例,或者在python子流程中记录日志语法错误和未捕获异常,并将其打印到终端 :

#!/usr/bin/env python import os import pty import sys with open('log','ab') as file: def read(fd): data = os.read(fd,1024) file.write(data) file.flush() return data pty.spawn([sys.executable,"test.py"],read)

或者你可以使用pexpect更多的灵活性:

import sys import pexpect # $ pip install pexpect with open('log','ab') as fout: p = pexpect.spawn("python test.py") p.logfile = fout # or .logfile_read p.interact()

如果你的子进程没有缓冲它的输出(或者它不干扰交互)并且把它的输出打印到stdout或stderr,那么你可以尝试subprocess :

#!/usr/bin/env python import sys from subprocess import Popen,PIPE,STDOUT with open('log','ab') as file: p = Popen([sys.executable,'-u','test.py'],stdout=PIPE,stderr=STDOUT,close_fds=True,bufsize=0) for c in iter(lambda: p.stdout.read(1),''): for f in [sys.stdout,file]: f.write(c) f.flush() p.stdout.close() rc = p.wait()

要分别读取stdout / stderr,你可以使用Python子 teed_call() 的输出文件和终端?

这应该工作

import subprocess f = open('file.txt','w') cmd = ['echo','hello','world'] subprocess.call(cmd,stdout=f)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐