2009-05-25 32 views
9

Ich benutze/bin/tcsh als meine Standard-Shell.os.system() Befehl unter welcher Linux-Shell ausführen?

Der Befehl tcsh style os.system ('setenv VAR val') funktioniert jedoch nicht für mich. Aber os.system ('export VAR = val') funktioniert.

Also meine Frage ist, wie kann ich den os.system() run-Befehl unter welcher Shell wissen?

Antwort

5

os.system() ruft nur den Systemaufruf system() ("man 3 system"). Auf den meisten * nixes bedeutet das, dass Sie /bin/sh erhalten.

Beachten Sie, dass export VAR=val ist technisch nicht Standard-Syntax (obwohl bash versteht es, und ich denke, ksh tut auch). Es wird nicht auf Systemen funktionieren, bei denen /bin/sh eigentlich die Bourne-Shell ist. Auf diesen Systemen müssen Sie exportieren und als separate Befehle festlegen. (Dies funktioniert auch mit bash.)

9

In diesen Tagen sollten Sie das Subprocess Modul anstelle von os.system() verwenden. Laut der Dokumentation ist die Standardshell /bin/sh. Ich glaube, dass os.system() auf die gleiche Weise funktioniert.

Edit: Ich sollte auch erwähnen, dass das Unterprozessmodul Sie die Umgebung für den ausführenden Prozess über die env Parameter festlegen können.

+0

Tatsächlich ist/bin/sh (was fast immer irgendeine Form von Bourne Shell ist) fast immer, was gemeint ist, wenn irgendetwas * nix-related "the shell" ohne Qualifikation sagt. Es kann auch nützlich sein zu beachten, dass Sie, wenn Sie wirklich ein Snippet unter einer bestimmten Non-Bourne-Shell ausführen müssen, die Funktion wie '/ path/to/tcsh -c' an Ihr tcsh-Snippet hier '' übergeben können. –

2

Wenn Ihr Befehl eine Shell-Datei ist und die Datei ausführbar ist und die Datei mit "#!" Beginnt, können Sie Ihre Shell auswählen.

#!/bin/zsh 
Do Some Stuff 

können Sie diese Datei schreiben und es dann mit subprocess.Popen(filename,shell=True) ausführen und Sie jegliche Shell Sie verwenden möchten können.

Lesen Sie auch unbedingt über os.system und subprocess.Popen.

+0

Ich wollte darauf hinweisen, dass Shell = True nicht notwendig ist, aber dann ist es mir aufgefallen: Ist es die Shell, die dafür verantwortlich ist, Shebangs zu interpretieren und dementsprechend zu handeln? –

+0

Korrekt. Die Shell interpretiert die "magischen" Bytes "#!" um zu sehen, welche andere Shell diese Datei wirklich verwenden soll. –

10

War gerade lesen Executing BASH from Python, dann 17.1. subprocess — Subprocess management — Python v2.7.3 documentation, und ich sah die executable Argument; und es scheint zu funktionieren:

$ python 
Python 2.7.1+ (r271:86832, Sep 27 2012, 21:16:52) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import os 
>>> print os.popen("echo $0").read() 
sh 
>>> import subprocess 
>>> print subprocess.call("echo $0", shell=True).read() 
/bin/sh 
>>> print subprocess.Popen("echo $0", stdout=subprocess.PIPE, shell=True).stdout.read() 
/bin/sh 
>>> print subprocess.Popen("echo $0", stdout=subprocess.PIPE, shell=True, executable="/bin/bash").stdout.read() 
/bin/bash 
>>> print subprocess.Popen("cat <(echo TEST)", stdout=subprocess.PIPE, shell=True).stdout.read() 
/bin/sh: Syntax error: "(" unexpected 
>>> print subprocess.Popen("cat <(echo TEST)", stdout=subprocess.PIPE, shell=True, executable="/bin/bash").stdout.read() 
TEST 

Hope this jemand hilft,
Prost!

+0

Ich bin das jemand. Das ist, was ich gesucht habe. Danke, dass du das notiert hast :) – Thorn

+0

Ja, das ist so wahr, wenn man von einem einzelnen Befehl zu mehreren Befehlen über ein T-Stück paßt, etwas wie 'command out = stdout | Abschlag> (command_1 in = stdin)> (command_2 in = stdin) '. Danke für das Posten, Daumen hoch ~ – CheeHow