Как получить команду в качестве ввода для оболочки, запущенной внутри подпроцесса Python - PullRequest
1 голос
/ 27 сентября 2010

Я хочу создать скрипт Python с графическим интерфейсом для запуска нескольких процессов.Все эти процессы первоначально были вызваны путем установки оболочки с помощью сценария perl (start_workspace.perl) и ввода имени исполняемого файла под оболочкой.внутри start_workspace.perl сначала устанавливаются некоторые переменные ENV, а затем вызывается exec (/ bin / bash), который запускает оболочку, поэтому вы можете ввести «execfile» в командной строке для запуска.

моя проблема, из моего скрипта на python, я все еще хочу использовать эту оболочку (by subprocess.popen ("perl start_workspace.perl")), но я не хочу останавливаться, чтобы вручную вводить "execfile",Я хочу, чтобы я мог указать execfile на этапе вызова start_workspace.perl, и процесс может завершиться без какого-либо вмешательства.

что-то вроде перенаправления команды.но я не знаю, возможно ли это.

subprocess.popen (("perl start_workspace.perl") <"execfile") </p>

Ответы [ 2 ]

2 голосов
/ 27 сентября 2010

Вы очень близки.В документации подпроцесса см .:

stdin , stdout и stderr указание выполненных программ 'стандартный ввод, стандартный вывод и дескрипторы стандартных ошибок, соответственно.Допустимые значения: PIPE, существующий файловый дескриптор (положительное целое число), существующий файловый объект и None.PIPE указывает, что должна быть создана новая труба для дочернего элемента.С None перенаправление не произойдет;дескрипторы файла ребенка будут унаследованы от родителя.Кроме того, stderr может быть STDOUT, что означает, что данные stderr из приложений должны быть записаны в тот же дескриптор файла, что и для stdout.

stdin, stderr и stdout являются именованными параметрами для метода popen,Вы можете открыть входной файл и передать его файловый дескриптор как стандартный ввод в ваш новый процесс.

1 голос
/ 27 сентября 2010

Используя модуль subprocess, этого можно достичь таким образом.Вы можете использовать поток stdin, чтобы написать команду для выполнения после установки фактического окружения.

start_workspace.perl

print "Perl: Setting some env variables\n";
$ENV{"SOME_VAR"} = "some value";
print "Perl: Starting bash\n";
exec('bash');

В python:

import subprocess 
p = subprocess.Popen( "perl start_workspace.perl", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
p.stdin.write('echo "Python: $SOME_VAR"\n')
p.stdin.write("make\n")
(stdoutdata, stderrdata) = p.communicate()
print stdoutdata
print stderrdata

Выход

Perl: Setting some env variables
Perl: Starting bash
Python: some value

make: *** No targets specified and no makefile found.  Stop.
...