2010-09-27 34 views
1

我想创建一个GUI python脚本来启动多个进程。所有这些进程最初都是通过使用perl脚本(start_workspace.perl)设置shell来调用的,然后在shell下键入可执行文件名。 里面,start_workspace.perl,它首先设置一些ENV变量,然后调用启动shell的exec(/ bin/bash),这样你可以在提示符下键入“execfile”来启动。我的问题,从我的python脚本,我仍然想要使用此shell(通过subprocess.popen(“perl start_workspace.perl”)),但我不想被停止手动输入“execfile”。我希望能够在调用“start_workspace.perl”的步骤中指定“execfile”,并且该过程可以在没有任何干预的情况下完成。如何将命令作为python子进程中启动的shell的输入

像命令重定向。但我不知道这是否可能。

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

回答

1

使用subprocess模块,可以通过这种方式实现。一旦设置了实际环境,您就可以使用标准输入流编写要执行的命令。

start_workspace.perl

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

在蟒蛇:

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. 
+0

我修复了你缺少的引用,但我认为这个问题涉及到不给execfile的名称给标准输入,但内容。 – mkb 2010-09-27 20:12:07

+0

嗨,罗德,非常感谢你的回答。所以你的意思是,一旦shell启动,p.write(“./execfile”)可以作为输入。我会尽力回来。再次感谢! – pepero 2010-09-27 20:18:01

+0

嗨,我试过了。不幸的是,这一个不起作用。我使用的execfile是“make”。 make不叫。 – pepero 2010-10-22 10:36:35

2

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

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

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

+0

喜,马特,非常感谢你的回答。你的意思是我可以使用以下内容:file = os.fdopen('./ execfile'),然后subprocess.popen(“perl start_workspace.perl”,stdin = file)? – pepero 2010-09-27 19:56:06

+0

我不是一个真正的Python家伙,但这似乎是合理的。 – mkb 2010-09-27 20:12:38

相关问题