python子进程模块无法执行shell

时间:2013-05-20 04:10:35

标签: python linux subprocess

[root@localhost root]$ cat test.c
#include <stdio.h>
int main(int argc, char*argv[]){
system("/bin/sh");
}

[root@localhost root]$ cat auto 
#!/usr/bin/env python
subprocess.Popen(['/root/test'])

我想使用子进程执行新的shell命令行

但它立即关闭我不知道为什么......

我该怎么做才能继续使用新的shell命令行?

如果还有其他方法可以做同样的事情而不是子进程模块,请告诉我:)

抱歉我的英语很差

2 个答案:

答案 0 :(得分:1)

subprocess需要导入:

#!/usr/bin/env python
import subprocess
subprocess.Popen(['/root/test'])

答案 1 :(得分:1)

我假设您通过在某个GUI中双击而不是从命令行运行Python脚本(因为从shell中打开/bin/sh是非常无用的)。这导致您没有看到NameErrorsubprocess未定义,因为您忘记导入它。

但是,修复不会解决您的问题。

首先,要意识到你的C程序是多余的;您可以直接从/bin/sh开始subprocess.Popen。但是如果你正在这样做,正如我猜测的那样,从GUI运行你的脚本,你将不会最终得到一个新的终端窗口,其中运行了一个shell; /bin/sh将意识到它没有在TTY上运行并立即退出。

相反,您可能想要做的是启动一个新的终端,让它运行您的shell。你如何做到这取决于你通常使用什么终端,但如果你使用xterm(其他常见的终端包括gnome-terminal或konsole),这里有一种可行的方法:

#!/usr/bin/env python

import os

os.execv('/usr/bin/xterm', ['xterm'])

(您需要使用os.execv而不是来自subprocessos.system的内容,因为这会使新终端替换 Python进程而不是作为孩子,他毫无意义地奔跑。)