Tkinter Python脚本不显示shell脚本的输出,例如mail unix命令

时间:2014-10-31 08:52:57

标签: python shell tkinter

我在Python中有以下脚本:

import Tkinter
import subprocess
from Tkinter import *

top = Tkinter.Tk()
top.geometry( "800x600" )

def helloCallBack():
    #print "Below is the output from the shell script in terminal"
    text = Text( top )
    text.insert( INSERT, "*****************************************************\n" )
    text.insert( INSERT, "Below is the output from the shell script in terminal\n" )
    text.insert( INSERT, "*****************************************************\n" )
    p = subprocess.Popen( './secho.sh',                                      \
                          stdout = subprocess.PIPE,                          \
                          stderr = subprocess.PIPE,                          \
                          shell  = True                                      \
                          )
    output, errors = p.communicate()
    #--------------------------------------------------- DEBUG FRAMING STEP 1
    print "DEBUG [stdout] sent:", repr( output ), "<EoString>"
    print "DEBUG [stderr] sent:", repr( errors ), "<EoString>"
    #--------------------------------------------------- DEBUG FRAMING STEP 2
    text.insert( "end", "DEBUG-prefix-to-validate-Tkinter-action.<BoString>" \
                       + output                                              \
                       + "<EoString>"                                        \
                       )
    text.pack()
    #--------------------------------------------------- DEBUG FRAMING STEP 3
    print "DEBUG FRAMING <EoCall>"

B = Tkinter.Button( top, text ="Hello", command = helloCallBack )

B.pack()
top.mainloop()

当我的secho.sh的shell脚本有一些简单的命令,如ls时,程序输出正常,如下面的截图所示。 (我不能在这里上传图片,因为我是堆叠溢出的新手) http://tinyurl.com/tkinterout

好像我有一些复杂的shell脚本,即使它是一个单行,例如:

mail -f ~/Desktop/Test/Inbox.mbox

显示只是文字&#34;下面是输出....&#34;别无其他。

我已经提到thisthis以及与此相关的许多其他堆栈溢出帖子。但我无法得到满意的答案,因为没有我发现处理邮件等命令(让用户在执行命令后与终端进行交互)。

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

以下是我在上述评论中建议作为第二种选择的工作示例。

import subprocess as sp

p = sp.Popen('''python -i -c "print('hello world')"''', stdin=sp.PIPE,
             stdout=sp.PIPE, stderr=sp.PIPE, universal_newlines=True)
out, err = p.communicate(input='quit()')
print("out = {}err = {}".format(out, err))

打印

out = hello world
err = >>> ... 

如果没有universal_newlines=True,输入arg必须是字节:p.communicate(input=b'quit()')。似乎控制台解释器提示转到stderr,而不是stdout。