如何将命令作为在python子进程内启动的shell的输入

时间:2010-09-27 18:43:30

标签: python input command subprocess

我想创建一个GUI python脚本来启动多个进程。最初通过使用perl脚本(start_workspace.perl)设置shell来调用所有这些进程,并在shell下键入可执行文件名。 在里面,start_workspace.perl,它首先设置一些ENV变量,然后调用exec(/ bin / bash),它启动shell,这样你就可以在提示符下键入“execfile”来启动。

我的问题,从我的python脚本,我仍然想使用这个shell(通过subprocess.popen(“perl start_workspace.perl”)),但我不想被停止手动输入“execfile”。我想在某种程度上我可以在调用“start_workspace.perl”的步骤中指定“execfile”,并且该过程可以在没有任何干预的情况下完成。

类似于命令重定向。但我不知道是否可能。

subprocess.popen((“perl start_workspace.perl”)<“execfile”)

2 个答案:

答案 0 :(得分:2)

你非常接近。在subprocess documentation中,请参阅:

  

stdin stdout stderr 分别指定执行程序的标准输入,标准输出和标准错误文件句柄。有效值为PIPE,现有文件描述符(正整数),现有文件对象和无。 PIPE表示应该创建一个新的子管道。使用None时,不会发生重定向;子项的文件句柄将从父项继承。另外,stderr可以是STDOUT,它表示应该将应用程序中的stderr数据捕获到与stdout相同的文件句柄中。

stdin,stderr和stdout是popen方法的命名参数。您可以打开输入文件并将其文件描述符作为stdin传递给新进程。

答案 1 :(得分:1)

使用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.