【问题标题】:Output to two different consoles using python使用python输出到两个不同的控制台
【发布时间】:2016-11-08 05:43:32
【问题描述】:

我正在编写一个脚本,我有两种不同的输出,比如 Op1 和 Op2。我想将 Op1 输出到调用 python 进程的终端,而 Op2 应该转储到不同的终端实例。我可以这样做吗?

即使答案是特定于 Linux 的也没关系,我需要一个临时解决方案。

【问题讨论】:

  • 尝试将其转储到文本文件中
  • 如果有帮助 - 只需正常打印脚本的输出,然后通过 tee 命令将其分叉到多个输出流中。

标签: python terminal console output


【解决方案1】:

您可以让 Python 脚本写入文件,或将其输出通过管道传输到文件 python script.py >> output.log,然后您可以使用 tail 文件 -f,这使其不断更新控制台上的视图。

示例 sn-p

# logmaker.py
import time
import datetime

buffer_size = 0 # This makes it so changes appear without buffering
with open('output.log', 'a', buffer_size) as f:
    while(True):
        f.write('{}\n'.format(datetime.datetime.now()))
        time.sleep(1)

运行那个文件

python logmaker.py

然后在一个或多个控制台中执行

tail -f output.log

或者less,如果你愿意的话

less +F output.log

你应该得到这样的持续更新

2016-07-06 10:52:44.997416
2016-07-06 10:52:45.998544
2016-07-06 10:52:46.999697

【讨论】:

  • 片段帮助了!谢谢。
【解决方案2】:

以下是 Linux 中的一些常见解决方案。

要实现这一点,您通常需要两个程序。

File i/o + Loop

  1. 主程序+文件写入器(打印Op1并将Op2写入文件A)
  2. 文件阅读器(不断获取A文件直到它被修改并打印文件A的内容)

Socket (pipe):

  1. 主程序 + 发送方(打印 Op1 并将 Op2 发送到特定套接字)
  2. receiver(在接收东西时监听特定的套接字并打印 Op2)

File i/o + Signal

  1. 主程序 + 文件写入器 + 信号发送器(打印 Op1 并将 Op2 写入文件 A 并向守护进程接收器发送信号)
  2. 信号接收器(停止直到接收到信号并打印文件A的内容)

顺便说一句,我想你的要求不需要编写任何守护程序,因为你肯定有两个控制台。

此外,我很确定在特定控制台上打印是可以实现的。


第二种解决方案的示例[Socket]

# print1.py (your main program)
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
sock.connect(('localhost', 8001))  
Op1 = 'Op1'
Op2 = 'Op2'
print Op1 
sock.send(Op2)  
sock.close()

步骤

// a. console 2: listen 8001 port
// Luckily, nc(netcat) is enough to finish this without writing any code.
$ nc -l 8001

// b. console 1: run your main program
$ python print1.py
Op1

// c. console 2
Op2

【讨论】:

    【解决方案3】:

    跟进 Kir 的回复 above,因为我正在处理类似的事情,我使用线程进一步修改了脚本,以便直接从脚本启动控制台侦听,而不必手动启动。希望对您有所帮助。

    import subprocess
    import threading
    import socket
    import time
    
    def listenproc():
     monitorshell = subprocess.Popen("mate-terminal --command=\"nc -l 8001\"",shell=True)
    
    def printproc():
     print("Local message")
     time.sleep(5) # delay sending of message making sure port is listening
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     sock.connect(('localhost', 8001))
     sock.send("Sent message")
     time.sleep(5)
     sock.close()
    
    listenthread = threading.Thread(name="Listen", target=listenproc, args=())
    printhread = threading.Thread(name="Print", target=printproc, args=())
    
    listenthread.start()
    printhread.start()
    listenthread.join()
    printhread.join()
    

    【讨论】:

    • osbornere 您的解决方案看起来很有趣,我仍在努力理解它。 > 'mate-terminal' 未被识别为内部或外部命令,
    • 什么是“mate-terminal”?
    • 我正在运行带有 Windows 64 的 python 3.7.1
    • mate-terminal 是 MATE 桌面环境的终端(mate-desktop.org)。自从我实现它以来已经过去了一段时间,我不记得我是否由于特定原因使用了 mate-terminal,或者只是因为我正在使用的机器上已经安装了 MATE。
    猜你喜欢
    • 2016-12-24
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    相关资源
    最近更新 更多