Запуск вторичного script в новом терминале

При запуске вторичного питона script:

  • Можно ли запустить subprocess.Popen или subprocess.call или даже execfile в новом терминале? (как в просто другом терминале, чем в текущем терминале, где выполняется script).
  • В качестве альтернативы, если перед запуском моей программы (основной) я сначала открываю два терминала, могу ли я затем указать вторичный script на второй терминал? (поэтому каким-то образом получить идентификатор открытых терминалов, а затем использовать определенный из них для выполнения подпроцесса).

Например, нужно сначала вызвать два подпроцесса, first.py, только тогда вызывается вторая, second.py. Поскольку два сценария first.py и second.py являются взаимозависимыми (как в first.py переходит в режим ожидания, пока не выполняется second.py, то first.py возобновляется, и я не знаю, как сделать эту работу связи между их в терминах подпроцессов.)

import subprocess

command = ["python", "first.py"]
command2 = ["python", "second.py"]
n = 5
for i in range(n):
    p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    p2 = subprocess.Popen(command2, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    while True:
        output = p.stdout.readline().strip()
        print output
        if output == 'stop':
            print 'success'
            p.terminate()
            p2.terminate()
            break

Framework (Ubuntu, python 2.7)

Ответы

Ответ 1

Я думаю, вы хотите что-то вроде

subprocess.call(['xterm','-e','python',script])

У хорошего старого xterm почти нет излишеств; в системе Freedesktop, возможно, запустите xdg-terminal. В Debian попробуйте x-terminal-emulator.

Однако, для обеспечения вашей программы X11 в большинстве случаев является ошибкой. Лучшее решение - запустить подпроцессы с выходом в файл журнала (или сокет или что-то еще), а затем отдельно запустить tail -f в этих файлах (в другом терминале или с другого сервера поверх ssh или с помощью вывод в журнал, который поддерживает rsyslog, или или или...), который сохраняет вашу программу простой и модульной, свободной от "удобных" зависимостей.

Ответ 2

Если вы используете tmux, вы можете указать, для какой цели вы хотите запустить команду:

tmux send -t foo.0 ls ENTER

Итак, если вы создали сеанс tmux foo.0, вы должны уметь:

my_command = 'ls'
tmux_cmd = ['tmux', 'send', '-t', 'foo.0', my_command]
p = subprocess.Popen(tmux_cmd)

Ответ 3

Вы можете указать tty окна терминала, в котором вы хотите выполнить команду:

ls > /dev/ttys004

Однако я бы рекомендовал перейти к подходу tmux для большего контроля (см. мой другой ответ).