2012-04-06 16 views
-1

Wenn ich versuche, ein Shell-Skript mit subprocess.call() oder os.system() auszuführen, wird das Skript ausgeführt, aber auch das Python-Skript wird beendet und alles, was nach dem Aufruf geschrieben wird, wird nie ausgeführt. Ich habe versucht, diesen Aufruf aus einer Bibliothek zu importieren und auszuführen oder aus einem separaten Python-Skript mit execfile() auszuführen, aber das gleiche ist auch dort passiert. Ist etwas mit meinem System nicht in Ordnung, oder soll es so sein? Wenn das letztere, dann wie soll ich das stoppen und mein Python-Skript laufen lassen, nachdem ich diesen Subprozess/Systemaufruf gemacht habe?Wie Subprozess beenden mein Skript beenden?

[email protected]:~/Desktop$ python 
Python 2.7.2+ (default, Oct 4 2011, 20:03:08) 
[GCC 4.6.1] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import subprocess 
>>> subprocess.call(["sh","test.sh"]) 
[email protected]:~/Desktop$ 

Dies ist das Shell-Skript:

export <SOMEPATHNAME>=/some/path/here 
exec $SHELL -i 

Ich denke, es ist die exec $SHELL -i ist, die ausgeführt alle Programme auf diesem speziellen Shell verursacht zu beenden. Aber ich weiß nicht, welche andere Alternative ich habe. Die export funktioniert nicht, wenn ich es nicht verwende. Derzeit exportiert der Pfad, den ich exportieren möchte, aber der Python-Prozess wird damit beendet.

Vielen Dank im Voraus!

+0

Zeigen Sie Ihr Skript. Sie werden wahrscheinlich keine Ausnahme bemerken. – marue

+0

SHOW ... CODE. Nur Sie kennen den Kontext dieser Frage. Der Rest von uns weiß nicht, was Sie tatsächlich versuchen und was das Ergebnis ist. – jdi

+0

Entschuldigung für die Verzögerung beim Hinzufügen. Ich habe den Code bereits hinzugefügt. –

Antwort

3

Die Shell ist nicht tödlich Ihr Skript, es tut genau das, was Sie es tun, starten Sie eine neue interaktive Bash-Sitzung. Beachten Sie, dass nach dem Aufruf von subprocess, wenn ich ein ps mache, Python noch läuft. Wenn Sie die Bash-Sitzung beenden, gelangen Sie zurück in den Python-Interpreter/Skript.

[email protected]:~$ python 
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) 
[GCC 4.4.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import subprocess 
>>> subprocess.call(['sh', 'test.sh']) 
[email protected]:~$ ps 
    PID TTY   TIME CMD 
1412 pts/3 00:00:00 bash 
1485 pts/3 00:00:00 python 
1486 pts/3 00:00:00 bash 
1509 pts/3 00:00:00 ps 
[email protected]:~$ exit 
exit 
0 
>>> print "im back in python" 
"im back in python" 
>>> exit() 

Export sollten Sie müssen keine neue Bash-Sitzung zu arbeiten beginnen. Ich bin mir nicht sicher, warum Sie exportieren, aber haben Sie in Betracht gezogen os.environ['SOMEPATHNAME'] = "/some/path/here". Dadurch wird die Umgebungsvariable in Ihrem Python-Skript festgelegt, bevor Sie subprocess.call verwenden.

+0

Ja, ich habe versucht, aber ich wollte eine Umgebungsvariable setzen, die über das ganze System persistent ist. Gibt es eine andere Möglichkeit, ein Shell-Skript aufzurufen, das eine Variable festlegt, die im gesamten System persistent ist? –

+0

Dauerhaft im ganzen System? Was bedeutet, dass Sie die Variable in einem Skript ändern und sich auch in einem anderen bereits laufenden Skript ändern? Ich bin mir nicht sicher, ob das möglich ist (und das hört sich nicht nach einer guten Idee an). –

+0

Ja, ich möchte, dass es fest eingestellt ist. Wenn ich irgendeine andere Shell öffne und 'env | grep "Variablenname" ', ich sollte das Ergebnis sehen. –

Verwandte Themen