Ich bin sehr neu zu Python, so würde ich gern gesehen Vorschläge für mehr idiomatische Möglichkeiten, dies zu tun, aber der folgende Code verwendet bash its elf uns zu sagen, welche Werte gesetzt werden, indem zuerst Bash mit einer leeren Umgebung aufrufen (env -i bash
), um uns zu sagen, welche Variablen als Baseline gesetzt sind, dann rufe ich es wieder und sagen bash, um Ihre "Variablen" -Datei und dann sagen Sie uns, welche Variablen jetzt gesetzt sind. Nach dem Entfernen einiger falsch-positiver und einer scheinbar leeren Zeile durchlaufe ich den "zusätzlichen" Ausgang und suche nach Variablen, die nicht in der Basislinie waren. Neu erkannte Variablen werden (vorsichtig) aufgeteilt und in das bash
Wörterbuch eingefügt. Ich habe meine frühere Idee, exec
zu verwenden, um die Variablen nativ in Python zu setzen, hier verlassen (aber auskommentiert), aber ich habe Probleme mit Zitaten/Entweichen bekommen, also bin ich zu einem Diktat übergegangen.
Wenn der genaue Aufruf (Pfad, etc) zu Ihrer "Variablen" -Datei ist anders als meins, dann müssen Sie alle Instanzen dieses Werts ändern - in der subprocess.check_output()
Anruf, in der list.remove()
Anrufe.
Hier ist die Probe variable Datei, die ich benutze, nur einige der Dinge zu zeigen, was passieren könnte:
foo_1="var1"
foo_2="var2"
foo_3="var3"
if [[ -z $foo_3 ]]; then
foo_4="test"
else
foo_4="testing"
fi
foo_5="O'Neil"
foo_6='I love" quotes'
foo_7="embedded
newline"
... und hier ist der Python-Skript:
#!/usr/bin/env python
import subprocess
output = subprocess.check_output(['env', '-i', 'bash', '-c', 'set'])
baseline = output.split("\n")
output = subprocess.check_output(['env', '-i', 'bash', '-c', '. myGlobalVariables.bash; set'])
additional = output.split("\n")
# these get set when ". myGlobal..." runs and so are false positives
additional.remove("BASH_EXECUTION_STRING='. myGlobalVariables.bash; set'")
additional.remove('PIPESTATUS=([0]="0")')
additional.remove('_=myGlobalVariables.bash')
# I get an empty item at the end (blank line from subprocess?)
additional.remove('')
bash = {}
for assign in additional:
if not assign in baseline:
name, value = assign.split("=", 1)
bash[name]=value
#exec(name + '="' + value + '"')
print "New values:"
for key in bash:
print "Key: ", key, " = ", bash[key]
Ein anderer Weg, es zu tun:
Inspiriert von Marat 's Antwort, kam ich mit diesem zweistufigen Hack.Beginnen Sie mit einem Python-Programm, nennen wir es "Stufe 1", die subprocess
verwendet, um bash aufzurufen, um die Variablendatei zu erhalten, wie meine obige Antwort, aber es teilt Bash mit, alle Variablen zu exportieren und dann den Rest auszuführen Ihr Python-Programm, das sich in "Stufe 2" befindet.
Stufe 1 Python-Programm:
#!/usr/bin/env python
import subprocess
status = subprocess.call(
['bash', '-c',
'. myGlobalVariables.bash; export $(compgen -v); exec ./stage2.py'
]);
Stufe 2 Python-Programm:
#!/usr/bin/env python
# anything you want! for example,
import os
for key in os.environ:
print key, " = ", os.environ[key]
Sie meinen Sie die Bash-Datei von Python analysieren möchten? wird nicht einfach sein. Enthält Ihr Skript neben der Deklaration der Variablen Befehle? –
Es tut, aber nicht viele. Ich habe versucht, Parsing zu vermeiden, aber ich könnte es definitiv tun, wenn das die einzige Option ist. – Bagelstein
Sind die Variablen, auf die Sie verweisen möchten, alle einfachen Zuordnungen? dh 'var_name = var_val' - so dass es keine Shell-Erweiterung, Befehlsersetzung usw. gibt. – theorifice