如何在Python子进程中获取命令作为shell的输入
我想创建一个图形界面的Python脚本,用来启动几个进程。最开始,这些进程是通过一个叫做start_workspace.perl的perl脚本来启动的。在这个脚本里,我需要先设置一些环境变量,然后调用exec(/bin/bash),这样就可以打开一个命令行窗口,在提示符下输入可执行文件的名字来启动它。
我的问题是,我希望在我的Python脚本中仍然使用这个命令行窗口(通过subprocess.popen("perl start_workspace.perl")),但是我不想手动输入“execfile”。我想要一种方法,可以在调用“start_workspace.perl”的时候就指定“execfile”,这样整个过程就可以自动完成,不需要任何干预。
这有点像命令重定向,但我不知道这样做是否可行。
比如说,subprocess.popen(("perl start_workspace.perl") < "execfile")
2 个回答
你已经很接近了。在subprocess 文档中,可以看到:
stdin、stdout 和 stderr 分别代表程序的标准输入、标准输出和标准错误输出。这些参数可以设置为几种有效的值:PIPE(管道)、一个已经存在的文件描述符(正整数)、一个已经存在的文件对象,或者 None。选择 PIPE 意味着要为子进程创建一个新的管道。如果设置为 None,就不会进行重定向;子进程会继承父进程的文件句柄。此外,stderr 也可以设置为 STDOUT,这表示应用程序的错误输出会被捕获到和标准输出相同的文件句柄中。
stdin、stderr 和 stdout 是 popen 方法的命名参数。你可以打开一个输入文件,并将它的文件描述符作为 stdin 传递给你的新进程。
使用 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.