Выполнить команду терминала из python в новом окне терминала?

цель здесь-запустить новый файл python в новой оболочке из и существующего файла python в существующей оболочке. Скажем, у меня есть два файла, aaa.py и bbb.py - ... Скажем для простоты, что все aaa.py делает это...

subprocess.call('python bbb.py', shell=True)

...и допустим, что bbb.py делает...

print 'It worked'

Теперь цель состоит в том, чтобы запустить aaa.py в терминале 1 и запустите его bbb.py в терминале 2. Я ожидал бы, что что-то вроде команды ниже будет существовать, но не могу понять это.

subprocess.call_in_new_window('python bb.py', shell=True)

3 ответов


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

в некоторых случаях os.startfile будет делать то, что вы хотите, но это не будет универсальным.

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


С Windows cmd самый простой способ сделать это -start командная оболочка. Если вещь вы start любая программа командной строки, включая python, он получит новое окно cmd. Итак, что-то вроде:

subprocess.call('start /wait python bb.py', shell=True)

OS X имеет аналогичную команду,open. И это настоящая программа. чем команда оболочки, так что вам не нужно shell=True. Однако запуск программы или скрипта командной строки с помощью open обычно не открывает новое окно терминала. На самом деле, весь смысл в том, чтобы позволить вам запускать программы, как если бы они дважды щелкнули в Finder, который никогда не запускает что-то в терминале, если это не a .командный файл.

таким образом, вы можете создать временный .command файл-оболочку и open что; что-то вроде этого (непроверено):

with tempfile.NamedTemporaryFile(suffix='.command') as f:
    f.write('#!/bin/sh\npython bb.py\n')
    subprocess.call(['open', '-W', f.name])

кроме того, вы можете явно указать open использовать терминал.приложение, что-то вроде этого:

subprocess.call(['open', '-W', '-a', 'Terminal.app', 'python', '--args', 'bb.py'])

или вы можете написать терминал.app через AppleEvents. Например:

appscript.app('Terminal').do_script('python bb.py')

событие "do script" открывает новое окно и запускает свой аргумент в качестве команды. Если вам нужен более подробный контроль, откройте словарь сценариев в Редакторе AppleScript и посмотрите все забавные вещи, которые вы можете сделать.


на Linux или другие системы * nix ... ну, есть 65,102 различных настольных сред, пусковых установок и терминальных программ. Вам нужно работать над всеми из них?

С gnome-terminal, просто запуск терминала снова дает вам новое окно, и


вы не сможете сделать это, по крайней мере, не так просто, как вы думаете об этом. Я подозреваю, что вы говорите о Mac из-за "окна терминала".

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

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

окна и оболочки немного непересекающиеся.


этого, наверное, должен быть комментарий, но так как я пока не могу...

в Windows , вы можете сделать:

subprocess.call('python bb.py', creationflags=subprocess.CREATE_NEW_CONSOLE)