我现在正在使用python。我有一个代表我整个程序的线程。我想打开另一个控制台窗口使用os.system(xterm&)作为一个有效的线程。唯一的问题是,当另一个线程打印到旧窗口时,是否可以打印到新窗口?
import sys
import os
def my_fork():
child_pid = os.fork()
if child_pid == 0:
function=open('SMITH747.txt','r')
f=function.readlines()
fd = open("output", "w")
# Open xterm window with logs from that file
p = subprocess.Popen(["xterm", "-e", "tail", "-f", "output"])
# Do logging
while(True):
for i in range(1):
fd.write("Hello, world!")
time.sleep(2)
if f==[]:
pass
else:
bud=False
fd.flush()
else:
function=open('SMITH747.txt','w')
var=input('Enter ')
if var=='q':
function.write('yo')
if __name__ == "__main__":
my_fork()
这就是我现在所拥有的:除了我不能让它读取我的文件并且如果f不是[]时终止它。如果有人可以帮助我调试这部分,我将非常感激。那就完美了!
答案 0 :(得分:0)
您可以创建一个named pipe,让新线程写入,然后在管道上生成一个运行tail -f
的新终端。
答案 1 :(得分:0)
使用subprocess.Popen()创建子进程。在这种情况下,您可以指定PIPE并写入子节点的stdin。
import subprocess
p = subprocess.Popen(["xterm"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
output = p.communicate("inputmessage")[0]
<强>更新强>
直接xterm没有收到输入,所以这里不是那么直接。
import subprocess
# Open file for output
fd = open("output", "w")
# Open xterm window with logs from that file
p = subprocess.Popen(["xterm", "-e", "tail", "-f", "output"])
# Do logging
fd.write("Hello, world!")
fd.flush()
现在您可以将stdout描述符重定向到fd,因此“print”会将输出写入文件。但它将适用于所有线程...
答案 2 :(得分:0)
对于unix解决方案:
命令tee旨在允许在仍然输出到控制台的同时输出到日志文件。您的第二个术语可以在输出文件上使用tail -f跟随该文件。
答案 3 :(得分:0)
我想打开一个新控制台的原因是我可以在新窗口中输入var = input('输入q:')&gt;并等待用户按Enter键从而终止旧线程... < / p>
我看到的最简单的方法是在单独的终端中询问用户的帮助脚本。并且它不是stdin / stdout重定向黑客:)
main.py:
import os
os.mkfifo("/tmp/1234");
os.system("xterm -e python input.py &")
f = open("/tmp/1234")
print(f.read())
input.py:
var=input('Enter q here: ')
fifo = open('/tmp/1234','w')
fifo.write(str(var))
fifo.flush()
答案 4 :(得分:0)
import os, subprocess, time, threading
# Reads commands from fifo in separate thread.
# if kill command is received, then down continue flag.
class Killer(threading.Thread):
def __init__ (self):
threading.Thread.__init__(self)
self.continueFlag = True
def run(self):
fd=open('ipc','r')
command = fd.read()
if command == "kill\n":
self.continueFlag = False
def my_fork():
# create fifo for reliable inter-process communications
# TODO: check existence of fifo
os.mkfifo('ipc')
# Be careful with threads and fork
child_pid = os.fork()
if child_pid == 0:
fd = open("output", "w")
subprocess.Popen(["xterm", "-e", "tail", "-f", "output"])
# Create and start killer, be careful with threads and fork
killer = Killer()
killer.start()
# Perform work while continue flag is up
while(killer.continueFlag):
fd.write("Hello, world!\n")
fd.flush()
time.sleep(2)
# need to kill subprocess with opened xterm
else:
# File must be fifo, otherwise race condition is possible.
fd=open('ipc','w')
var=input('Enter ')
if var=='q':
fd.write('kill\n')
if __name__ == "__main__":
my_fork()
P.S。讨论远离主题,可能你应该改变它。