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

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

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

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

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

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

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

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

Kubuntu 17.10

2

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

ᛈᚺ'ᚾᚷᛚᚢᛁ ᛗᚷᛚᚹ'ᚾᚨᚠᚺ ᚲᛏᚺᚢᛚᚺᚢ ᚱ'lᚷᛖᚺ ᚹᚷᚨᚺ'ᚾᚨᚷᛚ ᚠᚺᛏᚨᚷᚾ

Asus Prime B460M-K, i5-10500, Intel 630 UHD + NVIDIA GeForce RTX3060, DDR4 32 GB, SSD 1TB + HDD 2TB | Linux Mint 22.3 Cinnamon + Windows 11

3 (29.03.2017 20:06:14 отредактировано i_love_linux)

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

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

Kubuntu 17.10

4

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

ᛈᚺ'ᚾᚷᛚᚢᛁ ᛗᚷᛚᚹ'ᚾᚨᚠᚺ ᚲᛏᚺᚢᛚᚺᚢ ᚱ'lᚷᛖᚺ ᚹᚷᚨᚺ'ᚾᚨᚷᛚ ᚠᚺᛏᚨᚷᚾ

Asus Prime B460M-K, i5-10500, Intel 630 UHD + NVIDIA GeForce RTX3060, DDR4 32 GB, SSD 1TB + HDD 2TB | Linux Mint 22.3 Cinnamon + Windows 11

5

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

Kubuntu 17.10

6

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

ᛈᚺ'ᚾᚷᛚᚢᛁ ᛗᚷᛚᚹ'ᚾᚨᚠᚺ ᚲᛏᚺᚢᛚᚺᚢ ᚱ'lᚷᛖᚺ ᚹᚷᚨᚺ'ᚾᚨᚷᛚ ᚠᚺᛏᚨᚷᚾ

Asus Prime B460M-K, i5-10500, Intel 630 UHD + NVIDIA GeForce RTX3060, DDR4 32 GB, SSD 1TB + HDD 2TB | Linux Mint 22.3 Cinnamon + Windows 11

7

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

Спасибо большое  bi

Kubuntu 17.10

8

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

ᛈᚺ'ᚾᚷᛚᚢᛁ ᛗᚷᛚᚹ'ᚾᚨᚠᚺ ᚲᛏᚺᚢᛚᚺᚢ ᚱ'lᚷᛖᚺ ᚹᚷᚨᚺ'ᚾᚨᚷᛚ ᚠᚺᛏᚨᚷᚾ

Asus Prime B460M-K, i5-10500, Intel 630 UHD + NVIDIA GeForce RTX3060, DDR4 32 GB, SSD 1TB + HDD 2TB | Linux Mint 22.3 Cinnamon + Windows 11

9

i_love_linux пишет:

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

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

ЗЫ
Для konsole мона реализовать как-то так:

#!/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
- Пап, а вирусы под линукс есть?
- Есть, но всего 5, и их сначала нужно откомпилировать под свою систему, дать права на запуск и запустить.
Как сделать и разместить скриншот || Прежде чем создавать тему

10 (29.03.2017 21:19:53 отредактировано i_love_linux)

Rizado пишет:

выложите код, который у Вас получился

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

+ открыть спойлер
#!/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

Kubuntu 17.10

11

i_love_linux пишет:

либо gnome-terminal либо terminator

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

i_love_linux пишет:

открывает кучу окон

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

Rizado пишет:

Я не специалист по Python

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

- Пап, а вирусы под линукс есть?
- Есть, но всего 5, и их сначала нужно откомпилировать под свою систему, дать права на запуск и запустить.
Как сделать и разместить скриншот || Прежде чем создавать тему

12

DiabloPC пишет:

Ну с первым точно можно через dbus работать

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

DiabloPC пишет:

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

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

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

Kubuntu 17.10

13

i_love_linux пишет:

А так то их много.

ну кажись с запуском нескольких команд одновременно ты как раз то и справился сам, а вот с открытием вкладок и запуском процесов в этих вкладках и нужно разобраться =)

- Пап, а вирусы под линукс есть?
- Есть, но всего 5, и их сначала нужно откомпилировать под свою систему, дать права на запуск и запустить.
Как сделать и разместить скриншот || Прежде чем создавать тему

14

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

Команда:

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

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

Kubuntu 17.10

15

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

- Пап, а вирусы под линукс есть?
- Есть, но всего 5, и их сначала нужно откомпилировать под свою систему, дать права на запуск и запустить.
Как сделать и разместить скриншот || Прежде чем создавать тему

16

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

Kubuntu 17.10

17

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

#!/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 ***

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

#!/bin/bash
DIR=/path/to/files
for i in $DIR/*.py
do
gnome-terminal --tab -e "python3 $DIR/$i" &
done
- Пап, а вирусы под линукс есть?
- Есть, но всего 5, и их сначала нужно откомпилировать под свою систему, дать права на запуск и запустить.
Как сделать и разместить скриншот || Прежде чем создавать тему

18

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

Kubuntu 17.10

19

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

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

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

- Пап, а вирусы под линукс есть?
- Есть, но всего 5, и их сначала нужно откомпилировать под свою систему, дать права на запуск и запустить.
Как сделать и разместить скриншот || Прежде чем создавать тему

20 (30.03.2017 00:22:55 отредактировано i_love_linux)

DiabloPC пишет:

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

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

+ открыть спойлер

http://s010.radikal.ru/i314/1703/ef/1c4aad44a301t.jpg

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

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

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

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

Kubuntu 17.10

21

i_love_linux, А если пойти в обратном порядке??

#!/bin/bash
DIR=/some/folder/

CMD_LIST=$(for i in "$DIR"*.py
do
echo --tab --command=\"python3 $i\"
done)
echo $CMD_LIST
eval gnome-terminal $CMD_LIST

А в настройках gnome-terminal сделать вотЬ так:


http://i.piccy.info/i9/7f7d86a71ce7bd480ef1fce118590e95/1490827483/5488/1043479/Screenshot_20170330_011525_240.jpghttp://i.piccy.info/a3/2017-03-29-22-44/i9-11015695/240x128-r/i.gif
http://i.piccy.info/i9/24a631ade50aa66e053400a13ad1ed0d/1490827575/4896/1043479/Screenshot_20170330_011631_240.jpghttp://i.piccy.info/a3/2017-03-29-22-46/i9-11015696/240x108-r/i.gif
http://i.piccy.info/i9/c48667f04826f0b5b5ce91f7374633d9/1490827613/5784/1043479/Screenshot_20170330_012102_240.jpghttp://i.piccy.info/a3/2017-03-29-22-46/i9-11015697/240x117-r/i.gif

- Пап, а вирусы под линукс есть?
- Есть, но всего 5, и их сначала нужно откомпилировать под свою систему, дать права на запуск и запустить.
Как сделать и разместить скриншот || Прежде чем создавать тему

22

i_love_linux, с помощью xdotool решить этот вопрос можно, но лучше так не делать, тем более что всё необходимое есть в самом терминале.

23 (30.03.2017 13:50:37 отредактировано ormorph)

Ну если каждый скрипт python сам по себе вызывает командный интерпретатор python, т.е. файлу даны права на выполнение и в начале присутствует строчка типа #/usr/bin/python либо #/usr/bin/env python, то в начале указывать командный интерпретатор не обязательно.

gnome-terminal под рукой нет, но в mate-terminal проверил работает норм, по идее в gnome-terminal  не должно отличаться так как mate-terminal его форк.
Пример скрипта:

#/bin/bash

DIR=/путь

###
#функция запускает скрипт, затем
#перезапускает скрипт в случае аварийного завершения
###
test_func() {
file=$1
$file
if ! [ $? -eq 0 ] ; then
    sleep 5s
    test_func $file
fi
}

export -f test_func

mate-terminal -e "bash -c 'echo Start!;read'" &
sleep 0.4s

for i in $DIR/*.py
do
mate-terminal --tab -e "bash -c 'test_func $i; read'"
done

При желании перезапуск скрипта в случае аварийного завершения можно сделать интерактивным.

24

А можно вопрос не по теме? Какой прикладной результат у этой задачи, зачем это нужно? Не троллинга ради, действительно интересно.

Fedora GNOME3

25

xxblx пишет:

А можно вопрос не по теме? Какой прикладной результат у этой задачи, зачем это нужно? Не троллинга ради, действительно интересно.

В рамках телепатии, на ум приходит только одна мысль, для демонстрации возможностей и т.п.
А так на другом компе глянул gnome-terminal-3.18 в меню вообще нет создать новую вкладку. и создание новых вкладок не работает.

Как вариант из легковесных терминалов можно использовать roxterm, например так:

#/bin/bash

DIR=$(pwd)/d

test_func() {
file=$1
$file
if ! [ $? -eq 0 ] ; then
    sleep 5s
    test_func $file
fi
}

export -f test_func

roxterm -m -e "bash -c 'echo Start!;read'" &
sleep 0.4s

echo $DIR
for i in $DIR/*
do
roxterm --tab -e "bash -c 'test_func $i; read'"
done

26

зачем такие сложности? берем jenkins или rundeck, создаем в нем jobs для каждого из нужных скриптов, запускаем и смотрим на результат или на консольный выхлоп. Так все работают а не на кучке вкладок в терминале, это же абсурд...

27

dyasny пишет:

зачем такие сложности? берем jenkins или rundeck, создаем в нем jobs для каждого из нужных скриптов, запускаем и смотрим на результат или на консольный выхлоп. Так все работают а не на кучке вкладок в терминале, это же абсурд...

А для тестирования большого количества скриптов, написанных разными людьми...
Не ужели jobs быстрее создать для каждого скрипта проще, чем просто поместить все это кучей в отдельный каталог?
Хотя для этого использовать вкладки рутинная вещь, проще всю статистику собирать скриптом а не портить зрение, хотя убивать на стадии тестирования, вкладками удобно.
Лучше уж услышать что скажет ТС, для чего такие сложности.

28

ormorph пишет:

А для тестирования большого количества скриптов, написанных разными людьми...

именно так

ormorph пишет:

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

наделать jobs сейчас - займет время, но при уже готовой инфраструктуре, это занимает секунды. Плюс если разные люди пишут скрипты, можно дать им доступ и пусть сами создают jobs, запускают их, а админ/тимлид/етц может просто смотреть на дешборд и видеть сколько есть, и сколько пашут/падают

ormorph пишет:

Хотя для этого использовать вкладки рутинная вещь, проще всю статистику собирать скриптом а не портить зрение, хотя убивать на стадии тестирования, вкладками удобно.

еще проще смотреть на дэшборд дженкинса, и видеть что зеленое а что нет, глаза будут здоровее чем у того кто бегает по куче табов, гарантированно.

29

DiabloPC, отлично  bp  Спасибо большое  bi
Работает как мне нужно))))))))))))
*** Добавлено: 30.03.2017 22:04:46 ***

ormorph пишет:

Ну если каждый скрипт python сам по себе вызывает командный интерпретатор python, т.е. файлу даны права на выполнение и в начале присутствует строчка типа #/usr/bin/python либо #/usr/bin/env python, то в начале указывать командный интерпретатор не обязательно.

Хм, не знал))
Но использую только один вариант, в самих скриптах прописана строчка #!/usr/bin/python3
Спасибо за подсказку, на будущее  ab

*** Добавлено: 30.03.2017 22:09:53 ***

xxblx пишет:

Какой прикладной результат у этой задачи, зачем это нужно

Чтобы вручную не запускать каждый файл отдельно в терминале  ab
А то их может быть и 100 штук)))))
Пока максимум 30 было (и это только начало)

Как то не доставляет мне удовольствия запускать каждый день 30 скриптов в терминале.
Зачем это делать вручную, если можно автоматизировать этот процесс  ab

Kubuntu 17.10

30 (01.04.2017 11:01:37 отредактировано i_love_linux)

ormorph пишет:

А так на другом компе глянул gnome-terminal-3.18 в меню вообще нет создать новую вкладку. и создание новых вкладок не работает.

Как по мне, это лишнее))
Мне гораздо удобнее и приятнее пользоваться горячими клавишами  ab
*** Добавлено: 30.03.2017 22:29:03 ***

dyasny пишет:

зачем такие сложности? берем jenkins или rundeck

Я и слов то таких не знаю  ag

*** Добавлено: 30.03.2017 22:35:30 ***

ormorph пишет:

не портить зрение

Хм, не думаю что раз-второй (за весь день) пробежаться по вкладкам это сильно негативно скажется на зрении.
Полагаю что от "свитча" в том же браузере к примеру, больше вреда  ab

Kubuntu 17.10