Использование xterm для открытия новой консоли: как во время печати текущей консоли печатать также на новой консоли - PullRequest
0 голосов
/ 14 августа 2010

Я сейчас использую 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 голосов
/ 14 августа 2010
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. обсуждение далеко от темы, вероятно, вы должны изменить его.

0 голосов
/ 14 августа 2010

причина, по которой я хочу открыть новую консоль, заключается в том, что я могу var = input ('Enter q here:')> в новом окне и ждать, пока пользователь нажмет ввод, тем самым прервав старую ветку ...

Самый простой способ, который я вижу, это вспомогательный скрипт для запроса пользователя в отдельном терминале. И это не перенаправление 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()
0 голосов
/ 14 августа 2010

Используйте 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» запишет вывод в файл. Но это будет для всех потоков ...

0 голосов
/ 14 августа 2010

Для решения Unix:

Команда tee предназначена для разрешения вывода в файл журнала при одновременной выдаче на консоль.Ваш второй член может просто следовать за этим файлом с tail -f в выходном файле.

0 голосов
/ 14 августа 2010

Возможно, вы могли бы создать именованный канал , записать в него свой новый поток, а затем создать новый терминал, который запускает tail -f в канале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...