Python - 在“终端”上打印到标准输出

3

在开始之前,我要为这个问题向大家道歉。也许这是一个愚蠢的问题,但我找不到解决方案。 我正在远程机器上工作,不知道是什么类型的机器。

我的 Python 代码似乎可以工作,如下所示。问题是我想在屏幕上打印一些输出,但什么也没有发生。 我已经尝试了 print 和 raw_input,但都没有任何反应......您知道其他方法吗?

# Set up fields of reply message based on query
def prepareReply():
    global authorReply, authorReplyLen, localConvId, originConvId, blbContentAndUntUnz, linkName

    print "PLOP!"
    raw_input("blabla")

    #print "="*10

感谢!

打印输出到标准输出 - 问题一定出在其他地方。你使用的是哪个Python版本? - Joris Timmermans
2.4 默认情况下,标准输出是否可能被重定向到其他地方? - wheisenberg
可以重定向标准输出,但我认为默认情况下不会这样做。 在我无法访问标准输出的情况下,我使用重定向来记录日志到文件中。 - Joris Timmermans
可能无法访问标准输出(stdout)... - wheisenberg
你在 Python 解释器中尝试过打印输出吗? - uolot
使用Python解释器时,打印功能正常!我认为shell脚本正在将输出重定向到其他地方... 我通过在文件上打印来解决了这个问题! - wheisenberg
4个回答

9
import sys
print "Hi!"
sys.stdout.flush()

2

要将标准输出重定向到可读的内容,可以使用文件进行重定向:

class PyLogger:

  def __init__(self, source):
    self.file_handle = open('Python_Log.txt', 'a')
    self.source=source
    self.buf = []

  def write(self, data):
    self.buf.append(data)
    if data.endswith('\n'):
      self.file_handle = open('Python_Log.txt', 'a')
      self.file_handle.write('\t' * indent_level)
      self.file_handle.write(self.source + "::" + ''.join(self.buf))
      self.file_handle.close()
      self.buf = []

  def __del__(self):
    if self.buf != []:
      self.file_handle = open('Python_Log.txt', 'a')
      self.file_handle.write('\t' * indent_level)
      self.file_handle.write(self.source + "::" + ''.join(self.buf) + '\n')
      self.file_handle.close()      
    self.file_handle.close()

import sys
sys.stdout = PyLogger('stdout')
sys.stderr = PyLogger('stderr')

看起来write()和__del__()中的第一个open()和close()是多余的。或者你想做self.file_handle.flush()吗?此外,file_handle实际上可以是类属性而不是实例属性,因为它被所有实例共享。 - Eric O. Lebigot
这只是一些“可运行的代码”的简单复制粘贴,我好久没再考虑过了,可能最初来自互联网。你很可能是正确的,很多代码都是多余的。 - Joris Timmermans

2
这只是一个猜测,但是从您的评论中的措辞来看,它可能是一个Web服务器应用程序(提示:提供有关您环境的更多详细信息将有助于解决问题)。在这种情况下,stdout 可能会被重定向到其他地方,至少不会输出到浏览器。
您实际上是如何运行该代码的?您是在命令行提示符下键入“python myprogram.py”,还是在浏览器中点击“重新加载”?

该应用正在服务器上运行,但不是Web服务器!它是一个特定的服务器处理交易... 要运行Python程序,我必须运行一个运行我的Python应用程序的shell脚本!我不知道这个shell脚本是如何完成的... - wheisenberg
1
好的,看起来你已经从Python的角度做了可以预期的事情。由于你的脚本是通过我们都不知道任何信息的其他框架运行的,stdout可能会被重定向到任何地方。你可以尝试的一件事是:out = open("/dev/tty", "w"); print >>out, "hello world" - Greg Hewgill
1
如果它是通过某个框架运行的,也许return "PLOP!"会起作用? - uolot

-1
除了Jori对sys.stdin和stdout的重载之外,还应该按照以下方式存储stdin和stdout的原始值:
import sys
savestreams = sys.stdin, sys.stdout
sys.stdout = PyLogger('stdout')
sys.stderr = PyLogger('stderr')
... 
...
...
sys.stdin, sys.stdout = savestreams

另一个简单的方法是:

sys.stdout = sys.__stdout__
sys.stdin = sys.__stdin__

如果你不这样做,你可能会发现自己为什么打印函数不再向屏幕发送文本而感到困惑。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接