使用xterm打开一个新控制台:如何在当前控制台打印时,也在新控制台上打印

时间:2010-08-14 03:04:57

标签: python linux multithreading console

我现在正在使用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不是[]时终止它。如果有人可以帮助我调试这部分,我将非常感激。那就完美了!

5 个答案:

答案 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。讨论远离主题,可能你应该改变它。