9 Stimmen

os.system() führt den Befehl unter welcher Linux-Shell aus?

Ich verwende /bin/tcsh als meine Standard-Shell.

Allerdings kann der tcsh-Befehl os.system('setenv VAR val') funktioniert bei mir nicht. Aber os.system('export VAR=val') funktioniert.

Meine Frage ist also, wie kann ich die os.system() Befehl unter welcher Shell ausführen?

11voto

sdaau Punkte 34279

Habe gerade gelesen Ausführen von BASH aus Python dann 17.1. subprocess - Verwaltung von Unterprozessen - Python v2.7.3 Dokumentation 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

Ich hoffe, das hilft jemandem,
Zum Wohl!

0 Stimmen

Ich bin dieser Jemand. Das ist es, wonach ich gesucht habe. Vielen Dank für diesen Hinweis :)

0 Stimmen

Ja, das ist so, wenn man stdout von einem einzelnen Befehl an mehrere Befehle mit Hilfe von tee weiterleitet, etwa so command out=stdout | tee >(command_1 in=stdin) >(command_2 in=stdin) . Danke für diesen Beitrag, Daumen hoch~

9voto

Kamil Kisiel Punkte 18687

Heutzutage sollten Sie die Unterprozeß Modul anstelle von os.system() . Nach der dortigen Dokumentation ist die Standard-Shell /bin/sh . Ich glaube, dass os.system() funktioniert auf die gleiche Weise.

Edit: Ich sollte auch erwähnen, dass das Subprozessmodul es Ihnen erlaubt, die Umgebung, die dem ausführenden Prozess zur Verfügung steht, durch die Option env Parameter.

0 Stimmen

In der Tat ist /bin/sh (das fast immer eine Form der Bourne-Shell ist) fast immer gemeint, wenn in einem *nix-bezogenen Dokument ohne Einschränkung "die Shell" steht. Wenn Sie wirklich ein Snippet unter einer bestimmten Nicht-Bourne-Shell ausführen müssen, können Sie der Funktion etwas wie '/pfad/zu/tcsh -c "Ihr tcsh Snippet hier"' übergeben.

5voto

Laurence Gonsalves Punkte 131009

os.system() ruft einfach die system() Systemaufruf (" man 3 system "). Auf den meisten *Nixen bedeutet dies, dass Sie /bin/sh .

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

2voto

S.Lott Punkte 371691

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

#!/bin/zsh
Do Some Stuff

Sie können diese Datei schreiben und sie dann mit subprocess.Popen(filename,shell=True) und Sie können jede Shell verwenden, die Sie wollen.

Bitte lesen Sie auch este über os.system y subprocess.Popen .

0 Stimmen

Ich wollte darauf hinweisen, dass shell=True nicht notwendig ist, aber dann kam es mir in den Sinn: ist es die Shell, die für die Interpretation von Shebangs verantwortlich ist und entsprechend handelt?

0 Stimmen

Richtig. Die Shell interpretiert die "magischen" Bytes "#!", um herauszufinden, welche andere Shell diese Datei wirklich benutzen sollte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X