我正在写一个脚本,我有两种不同的输出,比如Op1和Op2。我想将Op1输出到调用python进程的终端,而Op2应该被转储到不同的终端实例。我能这样做吗?
即使答案是特定于Linux的,也没关系,我需要一个临时解决方案。
答案 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
:
Socket (pipe)
:
File i/o + Signal
:
顺便说一句,我认为您的要求不需要编写任何守护程序,因为您肯定有两个控制台。
此外,我非常确定在特定控制台上打印是可以实现的。
第二种解决方案的例子[插座]
# 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()