Wie Shell-Variablen in subprocess.Popen (in einer weniger hässlichen Art und Weise ...) einzustellen

StackOverflow https://stackoverflow.com/questions/1845435

Frage

Hinweis: Dies ist nicht die gleiche Frage wie Python :. Persistent Shell-Variablen in subprocess , wie diese Frage tatsächlich zu Umgebungsvariablen, nicht Variablen Shell

Ich versuche, eine grundlegende Benchmark zu automatisieren, dass ich in csh machte die Schale mit dem integrierten in time Befehl. Sie können die Ausgabe von time optimieren, indem Sie die Variable mit dem gleichen Namen in der Shell-Einstellung wie folgt:

set time=(1000000000 "%U %S %E %P %W %X %D %K %M %F %R %I %O %r %s %k %w %c")

Dies ist jedoch natürlich nicht eine Umgebungsvariable, so dass Sie nicht in den env Parametern im subprocess.Popen Konstruktor übergeben können (Ich habe versucht, die erste ...). Sie können es hacken zusammen durch Missbrauch (imo, jedenfalls) das cmd Argument, das zu tun, und dann Ihre tatsächliche Arbeit (verkürzt schön anzuzeigen):

time_cmd = 'set time=(1000000000 "%U %S %E %P %c"); time ./some_func'
p = subprocess.Popen(cmd, executable="/bin/csh", shell=True, ...)

und das funktioniert, wie man es erwarten würde, aber es scheint nicht wirklich den richtigen Weg zu gehen (und bis zu einem gewissen ziemlich schrecklich cmd Konstruktion führen können, wenn Sie eine Reihe von verschiedenen Shell-Verhalten optimieren wollen).

Gibt es eine andere Art und Weise Shell-Variablen in subprocess andere als diese Flickschusterei zu setzen?

War es hilfreich?

Lösung

Sie haben eine begrenzte Anzahl von Optionen, um einen Kind-Prozess (Aufruf Argumente, Umwelt und Streams) zu kommunizieren. Da Stellgröße einer Schale in einem allgemeineren Sinne ist ein Kind-Prozesses des internen Zustand zu modifizieren, was nennt man eine „Flickschusterei“ eigentlich ganz vernünftig ist. Ich weiß nicht von irgendwelchen csh-Varianten, die eine besondere Art und Weise haben Shell-Variablen zu laden.

Sie können jedoch durch das Schreiben alle Ihre Initialisierung Befehle an die Shell über ein Rohr oder sogar das Schreiben in eine Datei und mit ihnen durch csh des source builtin lesen neaten auf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top