使用python输出到两个不同的控制台

时间:2016-07-06 08:30:30

标签: python terminal console output

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

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

3 个答案:

答案 0 :(得分:2)

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

示例代码段

# 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

答案 1 :(得分:1)

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

要实现这一目标,通常需要两个程序。

File i/o + Loop

  1. 主程序+文件编写器(打印Op1并将Op2写入文件A)
  2. 文件阅读器(继续提取文件,直到修改并打印文件A的内容)
  3. Socket (pipe)

    1. 主程序+发件人(打印Op1并将Op2发送到特定套接字)
    2. 接收器(收听特定插座并在收到东西时打印Op2)
    3. File i/o + Signal

      1. 主程序+文件编写器+信号发送器(打印Op1并将Op2写入文件A并将信号发送到守护程序接收器)
      2. 信号接收器(停止直到接收信号并打印文件A的内容)
      3. 顺便说一句,我认为您的要求不需要编写任何守护程序,因为您肯定有两个控制台。

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

        第二种解决方案的例子[插座]

        # 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
        

答案 2 :(得分:0)

跟进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()