Можно ли указать уникальное имя для окон терминала для запуска команды через python?

Чтобы создать архив распространения приложений, разработчик использует некоторые инструменты под названием GNU Autotools. Эти инструменты помогут вам создать configure и amp; Makefile, который генерирует вам архив распространения.

Check:

Официальный сайт (autogen, autoconf, automake) Quick Tutorial

] После правильной настройки вы должны иметь возможность генерировать исходный архив, используя:

make dist

Примечания:

Эти инструменты были разработаны в основном для использования с проектами c / c ++. Найдите соответствующий инструмент для использования с другими языками (например, Ant для Java, инструменты установки для Python). Существуют также некоторые альтернативы, например, для c / c ++ cmake, qmake с Qt. Правильный рабочий процесс, начните с универсального исходного архива .tar.gz, затем распределите определенные пакеты, такие как исходный пакет Debian и .deb / двоичный пакет Debian.
3
задан 10 April 2018 в 04:04

3 ответа

Каждый открываемый вами терминал получает файл с уникальным номером (например, псевдотерминальное подчиненное устройство (PTS)) в /dev/pts/, с которым его можно распознать и устранить. Чтобы получить соответствующее имя файла в терминальном окне, вы можете использовать, например. tty (см. этот ответ для альтернатив, прочитайте man pts для более):

$ tty
/dev/pts/4

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

$ echo test >/dev/pts/4  # run anywhere
test                     # printed in terminal window 4

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

echo test </dev/pts/4 &>/dev/pts/4

Если вы хотите отобразить команду, Я также рекомендовал написать функцию (как использовать $ * при отсутствии определенных входных переменных, таких как $ 1 и $ 2 в bash-скрипте?), например:

run_in(){
  t=/dev/pts/$1 &&
  echo "${*:2}" >$t &&
  eval "${@:2}" <$t &>$t
}

В одной строке:

run_in(){ t=/dev/pts/$1&&echo "${*:2}" >$t&&eval "${@:2}" <$t &>$t;}

Используйте его так:

$ run_in 4 echo test  # run anywhere
$ echo test           # printed in terminal window 4 (if prompt was already there)
test                  # printed in terminal window 4

В этом случае единственными неизвестными являются номера /dev/pts/?, которые должна использовать ваша программа Python. Одним из возможных способов получить эти числа является запуск ваших собственных окон терминала, которые выводят их «числа» в файл, после чего вы сможете прочитать его [ref]. Предположим, вы используете gnome-terminal, соответствующая часть кода Python может быть чем-то вроде [ref]:

#!/usr/bin/python
import os
import subprocess

os.system("gnome-terminal -x bash -c 'tty > /tmp/my-app-tty-1; exec bash'")
my_terminal_1 = subprocess.Popen(["cat", "/tmp/my-app-tty-1"], stdout=subprocess.PIPE).communicate()[0]
command = "echo Test on: $(date) >" + my_terminal_1
print my_terminal_1
print command
os.system(command)

Если это скрипт Perl [ref] [!d10 ]

#!/usr/bin/perl
os.system("gnome-terminal -x bash -c 'tty > /tmp/my-app-tty-1; exec bash'");
my $my_terminal_1 = `cat /tmp/my-app-tty-1`;
my $command = "echo Test on: \$\(date\) > $my_terminal_1";
print ("$my_terminal_1");
print ("$command");
os.system("$command");
4
ответ дан 22 May 2018 в 11:32
  • 1
    Спасибо за вашу помощь, Итрид, чтобы запустить эту команду os.system("echo "+stopDBCommand+" >/dev/pts/20"), в которой stopDBCommand=/home/esarah/workspace/vt -stop /home/esara/workspace/home/mydb, она печатает команду на терминале, но не запускает ее, я должен нажать Enter, чтобы запустить ее. Он не выполняет команду, но он случайно запускал команду один раз. как это решить? – sc241 9 April 2018 в 23:02
  • 2
    @ sc241 Вы еще прочитали мой пост? Я объяснил это и дал решение во второй части моего ответа ... – dessert 9 April 2018 в 23:05
  • 3
    Приложение: (1) Программа python может выполнить gnome-terminal --working-directory='/home/<user>/project' -x bash -c "tty > /tmp/my-app-tty-1; exec bash", чтобы открыть новый терминал ... тогда мы сможем прочитать файл /tmp/my-app-tty-1, чтобы получить номер pts ( ); (2) Мы можем использовать tmux (или screen) вместо терминала ( reference ). – pa4080 9 April 2018 в 23:07
  • 4
    @ sc241, сделано, пожалуйста, просмотрите ответ. – pa4080 9 April 2018 в 23:53
  • 5
    @ sc241, #!/usr/bin/perl - shebang . Код, который я добавил, является рабочим примером скрипта Perl (извините за уродливый пример, это моя первая попытка с Perl). Поместите строки в файл (давайте назовем его file.pl), сделаем его исполняемым (chmod +x file.pl) и выполним его (./file.pl), чтобы увидеть результат. run_in() является функцией bash, вы можете поместить ее в свой файл ~/.bashrc, а затем выполнить source ~/.bashrc, и она будет доступна как команда оболочки. Лучшая идея - создать собственную функцию Perl на своей базе. – pa4080 10 April 2018 в 01:15

Каждый открываемый вами терминал получает файл с уникальным номером (например, псевдотерминальное подчиненное устройство (PTS)) в /dev/pts/, с которым его можно распознать и устранить. Чтобы получить соответствующее имя файла в терминальном окне, вы можете использовать, например. tty (см. этот ответ для альтернатив, прочитайте man pts для более):

$ tty /dev/pts/4

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

$ echo test >/dev/pts/4 # run anywhere test # printed in terminal window 4

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

echo test </dev/pts/4 &>/dev/pts/4

Если вы хотите отобразить команду, Я также рекомендовал написать функцию (как использовать $ * при отсутствии определенных входных переменных, таких как $ 1 и $ 2 в bash-скрипте?), например:

run_in(){ t=/dev/pts/$1 && echo "${*:2}" >$t && eval "${@:2}" <$t &>$t }

В одной строке:

run_in(){ t=/dev/pts/$1&&echo "${*:2}" >$t&&eval "${@:2}" <$t &>$t;}

Используйте его так:

$ run_in 4 echo test # run anywhere $ echo test # printed in terminal window 4 (if prompt was already there) test # printed in terminal window 4

В этом случае единственными неизвестными являются номера /dev/pts/?, которые должна использовать ваша программа Python. Одним из возможных способов получить эти числа является запуск ваших собственных окон терминала, которые выводят их «числа» в файл, после чего вы сможете прочитать его [ref]. Предположим, вы используете gnome-terminal, соответствующая часть кода Python может быть чем-то вроде [ref]:

#!/usr/bin/python import os import subprocess os.system("gnome-terminal -x bash -c 'tty > /tmp/my-app-tty-1; exec bash'") my_terminal_1 = subprocess.Popen(["cat", "/tmp/my-app-tty-1"], stdout=subprocess.PIPE).communicate()[0] command = "echo Test on: $(date) >" + my_terminal_1 print my_terminal_1 print command os.system(command)

Если это скрипт Perl [ref]

#!/usr/bin/perl os.system("gnome-terminal -x bash -c 'tty > /tmp/my-app-tty-1; exec bash'"); my $my_terminal_1 = `cat /tmp/my-app-tty-1`; my $command = "echo Test on: \$\(date\) > $my_terminal_1"; print ("$my_terminal_1"); print ("$command"); os.system("$command");
4
ответ дан 17 July 2018 в 17:10

Каждый открываемый вами терминал получает файл с уникальным номером (например, псевдотерминальное подчиненное устройство (PTS)) в /dev/pts/, с которым его можно распознать и устранить. Чтобы получить соответствующее имя файла в терминальном окне, вы можете использовать, например. tty (см. этот ответ для альтернатив, прочитайте man pts для более):

$ tty /dev/pts/4

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

$ echo test >/dev/pts/4 # run anywhere test # printed in terminal window 4

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

echo test </dev/pts/4 &>/dev/pts/4

Если вы хотите отобразить команду, Я также рекомендовал написать функцию (как использовать $ * при отсутствии определенных входных переменных, таких как $ 1 и $ 2 в bash-скрипте?), например:

run_in(){ t=/dev/pts/$1 && echo "${*:2}" >$t && eval "${@:2}" <$t &>$t }

В одной строке:

run_in(){ t=/dev/pts/$1&&echo "${*:2}" >$t&&eval "${@:2}" <$t &>$t;}

Используйте его так:

$ run_in 4 echo test # run anywhere $ echo test # printed in terminal window 4 (if prompt was already there) test # printed in terminal window 4

В этом случае единственными неизвестными являются номера /dev/pts/?, которые должна использовать ваша программа Python. Одним из возможных способов получить эти числа является запуск ваших собственных окон терминала, которые выводят их «числа» в файл, после чего вы сможете прочитать его [ref]. Предположим, вы используете gnome-terminal, соответствующая часть кода Python может быть чем-то вроде [ref]:

#!/usr/bin/python import os import subprocess os.system("gnome-terminal -x bash -c 'tty > /tmp/my-app-tty-1; exec bash'") my_terminal_1 = subprocess.Popen(["cat", "/tmp/my-app-tty-1"], stdout=subprocess.PIPE).communicate()[0] command = "echo Test on: $(date) >" + my_terminal_1 print my_terminal_1 print command os.system(command)

Если это скрипт Perl [ref]

#!/usr/bin/perl os.system("gnome-terminal -x bash -c 'tty > /tmp/my-app-tty-1; exec bash'"); my $my_terminal_1 = `cat /tmp/my-app-tty-1`; my $command = "echo Test on: \$\(date\) > $my_terminal_1"; print ("$my_terminal_1"); print ("$command"); os.system("$command");
4
ответ дан 23 July 2018 в 18:02

Другие вопросы по тегам:

Похожие вопросы: