LinuxForum.Fans
Тема

Запуск и управление терминалом из Python или Bash

Автор: i_love_linux 34 сообщений 2874 просмотров
29.03.2017 18:42 #421952

Есть задача:
Имеется папка с питоновскими скриптами (количество и название файлов может быть любым)

Можно ли как то, из программы на bash или python, запустить терминал и запустить каждый файл в отдельной вкладке терминала.

Cейчас приходится все в ручную запускать, но файлов бывает и по 100 штук, так что поднадоело уже *WALL*

Хочу как то автоматизировать этот процесс))

Может есть какое то API для управления терминалом!?

Пока дошел только до запуска терминала (python):

text

import os
# запускаем терминал
os.system("gnome-terminal")

Поделитесь соображениями на этот счет, пожалуйста :)

29.03.2017 19:52 #421954

i_love_linux, в Питоне вроде есть функция os.list для получения массива со списком файлов. Если я правильно запомнил её название.

29.03.2017 20:04 · отредактировано #421958

Rizado, Список файлов то не проблема получить))
Проблема заключается именно в "работе с терминалом" из python'a или bash.

А суть проблемы заключается в незнании как реализовать то что мне нужно(

29.03.2017 20:05 #421959

i_love_linux, а передать имя файла в качестве части строки, как аргумент? Я не специалист по Python, так что не могу точно сказать.

29.03.2017 20:11 #421961

Rizado, пробовал уже) Не работает такой вариант, просто терминал запускает и все.

29.03.2017 20:14 #421963

Надо пробовать, с ходу не скажу. Если подождёт до субботы, попробую.

29.03.2017 20:21 #421965

Rizado, подождет конечно, сам то вряд ли найду решение, потому как уже неделю "борюсь" с этой задачей :)

Спасибо большое *BRAVO*

29.03.2017 20:26 #421968

i_love_linux, выложите код, который у Вас получился. Может, ещё кто-то посмотрит. Либо сюда, но спрячьте под спойлер, либо на pastebin.

29.03.2017 20:41 #421973

"i_love_linux" написал:
запустить терминал и запустить каждый файл в отдельной вкладке терминала.
Я так понимаю что имеется ввиде графический эмулятор терминала.
Если так, то встает вопрос: какой именно?

ЗЫ
Для konsole мона реализовать как-то так:
text
#!/bin/bash
KONSOLE_PROCES=`pidof -s konsole`
if ["$KONSOLE_PROCES" == "" ]
then
konsole &
fi
KONSOLE_PROCES=`pidof -s konsole`
for i in /some/folder/*.py
do
SESSION_NUM=`qdbus org.kde.konsole-$KONSOLE_PROCES /Windows/1 org.kde.konsole.Window.newSession`
qdbus org.kde.konsole-$KONSOLE_PROCES /Sessions/$SESSION_NUM sendText "python ./$i"
qdbus org.kde.konsole-$KONSOLE_PROCES /Sessions/$SESSION_NUM sendText $'\n'
done
29.03.2017 21:19 · отредактировано #421974
"Rizado" написал:
выложите код, который у Вас получился

Вот что у меня получилось:

Показать
text

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import os

path_to_files = '/home/dimas/py_files' # Папка с файлами get_files_list = os.listdir(path_to_files) # Список файлов в папке

for f in get_files_list: os.system("gnome-terminal python3 %s" % f)

Но данный код просто открывает кучу окон терминала(
Добавлено: 29.03.2017 21:19:15

"DiabloPC" написал:
Я так понимаю что имеется ввиде графический эмулятор терминала.
Если так, то встает вопрос: какой именно?

Вы правильно поняли))

На вопрос какой именно, отвечу: либо gnome-terminal либо terminator

29.03.2017 21:56 #421975

"i_love_linux" написал:
либо gnome-terminal либо terminator
Ну с первым точно можно через dbus работать, про второй я даже не слышал :[
Но по ним точно ничего не скажу.....

"i_love_linux" написал:
открывает кучу окон
Смотреть либо в параметры запуска либо в dbus
Добавлено: 29th Mar 2017 8:56:08 pm

"Rizado" написал:
Я не специалист по Python
А здесь питон не при делах =) Без разницы откуда передавать команду, главное какую передать....
По сути этот вопрос можо свести к минимальному виду вот так: какой командой открыть новую вкладку в gnome-terminal и выполить команду в этой вкладке?.
29.03.2017 22:07 #421976
"DiabloPC" написал:
Ну с первым точно можно через dbus работать

Ок, буду копать в сторону Dbus. Спасибо)

"DiabloPC" написал:
А здесь питон не при делах =) Без разницы откуда передавать команду, главное какую передать....
По сути этот вопрос можо свести к минимальному виду вот так: какой командой открыть новую вкладку в gnome-terminal и выполить команду в этой вкладке?.

Можно было бы свести к минимальному виду если бы нужно было запускать один скрипт в терминале))
А так то их много.

Получается такая последовательность действий:
1. Запустить окно терминала
2. Запустить python скрипт
3. В цикле (открыть новую вкладку, запустить второй скрипт, открыть новую вкладку, запустить третий скрипт и т.д.)

29.03.2017 22:09 #421977

"i_love_linux" написал:
А так то их много.
ну кажись с запуском нескольких команд одновременно ты как раз то и справился сам, а вот с открытием вкладок и запуском процесов в этих вкладках и нужно разобраться =)
29.03.2017 22:14 #421978

DiabloPC, в том то и дело что не справился :D

Команда:

text

os.system("gnome-terminal python3 /path/to/py_file.py")

Просто запускает терминал, но не выполняет скрипт /path/to/py_file.py

29.03.2017 22:16 #421979

i_love_linux, Ну как-же не справился?? Куча окон открывается? Открывается. Значит одновременный запуск нескольких команд происходит, осталось разобраться как в эти окна передавать команды, которые нужно запустить

29.03.2017 23:19 #421982

DiabloPC, Ну да, куча окон открываются. Но это совсем не то что мне нужно))

29.03.2017 23:28 #421983

i_love_linux, Попробуй вот так..... должно работать....

text
#!/usr/bin/python3
# -*- coding: utf-8 -*-

import os

path_to_files = '/home/dimas/py_files' # Папка с файлами get_files_list = os.listdir(path_to_files) # Список файлов в папке

for f in get_files_list: os.system("gnome-terminal --tab -e "python3 %f"") ##Не уверен, нужна ли здесь пара скобок, обрамляющая всю команду.

Добавлено: 29th Mar 2017 10:28:59 pm

Ну или вот так:

text
#!/bin/bash
DIR=/path/to/files
for i in $DIR/*.py
do
gnome-terminal --tab -e "python3 $DIR/$i" &
done
29.03.2017 23:36 #421984

DiabloPC, первый вариант не работает, даже окно терминала не показывается.
Второй почти работает, но происходит нечто непонятное, то ли запускается новое окно в каждой итерации цикла, то ли пытается выполнить команду в одном и том же окне.
В общем тоже не работает :)

29.03.2017 23:49 #421985

i_love_linux, Так, давай по порядку:
[console=inline]gnome-terminal --tab -e "python3 $DIR/$i" &[/console]
gnome-terminal - внешняя команда, которую нам нужно запустить из скрипта (в данном случае gnome-terminal )
--tab - говорит о том что нужно открыть новую вкладку, в случае если gnome-terminal уже запущен
-e - указывает что нужно выполнить некую команду внутри нового терминала (вкладки)
"python3 $DIR/$i" - является параметром для -е, указывающим что нужно выполнить
& - указывает на продолжение выполнения цикла, не дожидаясь завершения выполнения предыдущей команды.
Что здесь может не работать??

Суть в том что тебе нужно запустить [console=inline]gnome-terminal --tab -e "твоя_команда"[/console], а не [console=inline]gnome-terminal "твоя_команда"[/console]
Добавлено: 29th Mar 2017 10:49:39 pm

ЗЫ
При запуске gnome-terminal с параметром -е после выполнения переданой команды окно/вкладка автоматом закрывается.

30.03.2017 00:16 · отредактировано #421987
"DiabloPC" написал:
При запуске gnome-terminal с параметром -е после выполнения переданой команды окно/вкладка автоматом закрывается.

Ага, не знал что закрывается) Поэтому и не понял что произошло.
Сейчас сделал цикл в каждом скрипте(для эмуляции долгого процесса), и вот что получилось:

Показать


Вместо открытия новой вкладки, открывается новое окно в каждой итерации цикла.
Но это еще не все, мне не нужно чтобы окно закрывалось при возникновении какой либо ошибки или исключения, а нужно чтобы я смог отреагировать на это и запустить например повторно скрипт в вкладке.

Я сейчас наткнулся в гугле на утилиту xdotool.
Почитал ее man, и походу это то что мне нужно.
По крайней мере насколько я понял(у меня не очень с английским)

Теперь главная задача: открыть терминал и получить идентификатор его окна, дабы можно было им манипулировать в дальнейшем.
Как открыть окно терминала уже известно, а вот как получить сразу его id - нет.

UPD: Или может есть способ открыть окно указав свой идентификатор или какое то уникальное имя окна?

Войдите или зарегистрируйтесь, чтобы ответить.