2013-05-20 4 views
0
[[email protected] root]$ cat test.c 
#include <stdio.h> 
int main(int argc, char*argv[]){ 
system("/bin/sh"); 
} 

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

я хочу использовать подпроцесс для выполнения командной строкипитона не может выполнить Shell

новой оболочки, но он сразу же закрыл я не знаю, почему ..

, что я должен сделать для продолжение новой командной строки оболочки?

, если есть еще один способ сделать то же самое вместо модуля подпроцесс, пожалуйста, дайте мне знать :)

жаль мой бедный английский

ответ

1

subprocess необходимо импортировать:

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

Я предполагаю, что вы используете свой скрипт Python, дважды щелкнув его в каком-то графическом интерфейсе, а не в командной строке (потому что открытие /bin/sh из оболочки довольно бесполезно). Это заставляет вас не видеть NameError: subprocess не определен, потому что вы забыли его импортировать.

Фиксация, которая не решит вашу проблему.

Во-первых, поймите, что ваша программа на C лишней; вы можете сразу начать /bin/sh через subprocess.Popen. Но если вы делаете это, поскольку, как я предполагаю, запуск вашего скрипта из графического интерфейса, вы не будете в конечном итоге иметь новое окно терминала с запущенной в нем оболочкой; /bin/sh собирается понять, что он не работает на TTY и немедленно выходит.

Вместо этого вы, вероятно, захотите открыть новый терминал , и пусть это запустит вашу оболочку. Как это сделать, зависит от того, что терминал, который вы обычно используете, но вот возможный способ сделать это, если вы используете Xterm (другие распространенные терминалы включают гном-терминал или Konsole):

#!/usr/bin/env python 

import os 

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

(Вы хотите использовать os.execv, а не что-то от subprocess или os.system, потому что это делает новый терминал заменяет процесс Python вместо бесцельного запуска в качестве его дочернего элемента.)

Смежные вопросы