Запуск вторичного 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 для большего контроля (см. мой другой ответ).