Variable in Python festlegen; in einem Shell-Script benutzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

Das Problem sieht wie folgt aus:
Ein Shell Script, welches eigentlich den Wert einer Variable aus der Konsole liest, soll nun nur mit Python dahingehend verändert werden, dass ein Python Programm den Wert der Variable dem Script zuweisen kann. Man müsste dazu das shell script öffnen und beschreiben also
s='variable'
f = file("~/script", "w")
f.write(s)

Aber ich möchte ja nur eine ganz bestimmte Zeile ändern. Kann man irgendwie einen Parameter übergeben welcher die Zeile angibt, sodass nur eine bestimmte Zeile beschreiben wird.

Ich habe mir überlegt das man mit Python den Wert der Variable in eine temporäre Textdatei schreiben könnte. Dann könnte man die Zeile "read variable" in "variable=` cat ~/tmp/Datei |head -1`" ändern.



Hat jemand von euch eine einfachere Lösung?
vielen Dank :)
Ubuntuxer
Zuletzt geändert von Ubuntuxer am Freitag 18. April 2008, 17:55, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo Ubuntuxer, willkommen im Forum,
Ubuntuxer hat geschrieben:Hat jemand von euch eine einfachere Lösung?
vielen Dank :)
Ja - dem Skript beim Starten Umgebungsvariablen mitgeben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

danke für die schnelle Antwort
Wie gebe ich denn Umgebungsvariablen mit, wenn ich das mit os.system('./scrit') starte?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du solltest besser ``subprocess.Popen`` verwenden, dort gibt es einen Parameter ``env`` über den du die Umgebungsvariablen bearbeiten kannst.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

Wenn ich
subprocess.Popen(['/home/johannes/Desktop/bash-script'], env = 'var')
eingebe bekomme ich nur Fehlermeldungen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

``env`` müsste ja auch aller Logik nach ein Dictionary sein, denn deine Umgebungsvariablen haben ja nicht nur einen Namen sondern brauchen ja auch noch einen Wert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

Ein Dictionary müsste dann doch so funktionieren:
env = {'var': 'a'}
var=Variablenname
a=Wert der Variablen var

Ich habs jetzt ausprobiert und es funktioniert wunderbar.
Vielen Dank :D
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

Ich hab jetzt ein neues Problem; ich kann das Script nicht als sudo starten
aus irgendeinem Grund funktioniert der folgende Befehl nicht:

Code: Alles auswählen

subprocess.Popen(['gksu ~/Script'], env = {'var': 'a'})
bei os.system hatte ich dieses Problem nicht.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

IMHO brauchst du dann shell=True... Damit ~ auch ersetzt wird. Kannst du aber auch direkt in Python ersetzten lassen...
Es ist auch besser statt ['gksu ~/Script'] es zu trennen: ['gksu', '~/Script']

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich hätte auch eher ``os.path.expanduser()`` verwendet.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

Das bringt leider auch nichts:

Code: Alles auswählen

subprocess.Popen(['gksu ' + os.path.expanduser('~') + '/script'], env = {'var': 'a'})
oder

Code: Alles auswählen

subprocess.Popen('gksu' + '/home/johannes/script', env = {'var': 'a'})
bringt beides die Fehlermeldung
Traceback (most recent call last):
File "./subprocess", line 4, in <module>
subprocess.Popen(['gksu ' + os.path.expanduser('~') + '/script'], env = {'var': 'a'})
File "/usr/lib/python2.5/subprocess.py", line 594, in __init__
errread, errwrite)
File "/usr/lib/python2.5/subprocess.py", line 1147, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Was kommt wohl aus 'gksu' + '/home/johannes/script' raus? Da fehlt ein Leerzeichen ;)
Wie wäre es hiermit:

Code: Alles auswählen

script_path = os.path.expanduser('~/script')
print script_path
subprocess.Popen(['gksu', script_path], env = {'var': 'a'})
Ist der Pfad auch richtig?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

Ich Idiot, aber leider bekomme ich immer noch eine Fehlermeldung:
(gksu:12166): Gtk-WARNING **: cannot open display:

Hat einer von euch eine Idee, wo das Problem liegen könnte.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ubuntuxer hat geschrieben:Hat einer von euch eine Idee, wo das Problem liegen könnte.
Ja. Der User mit dem du das Programm aufrufst, ist nicht gleich dem User mit der X-Session. Es muss der gleiche User sein, denn normalerweise dürfen fremde User keine Fenster in der X-Session öffnen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Statt gksu könntest du sudo nehmen...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

Der User mit dem du das Programm aufrufst, ist nicht gleich dem User mit der X-Session. Es muss der gleiche User sein, denn normalerweise dürfen fremde User keine Fenster in der X-Session öffnen.
Ich habe aber nur einen Bentzeraccount auf dem Rechner.
Statt gksu könntest du sudo nehmen...
Aber ich müsste doch dann das Passwort im Terminal eingeben, aber ich will eigentlich weg von der Konsoleneingabe :?

Könnte es vielleicht daran liegen das ich Hardy benutze und dass es wegen dem neuen PolicyKit Probleme gibt. Bug? Was mich vor allem wundert ist, dass es bei os.system ohne Probleme geklappt hat.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

``'DISPLAY': os.environ['DISPLAY']`` noch in das env-dict von subprocess.Popen packen.
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

Ich habs mal eingefügt:

Code: Alles auswählen

subprocess.Popen(['gksu', script_path], env = {'var': 'a', 'DISPLAY': os.environ['DISPLAY']})
aber immer noch bekomme ich nur eine Fehlermeldung
No protocol specified
(gksu:5872): Gtk-WARNING **: cannot open display: :0.0

Hat noch jemand eine Idee?

PS: Meine absolute Notlösung wäre eine temporöre Bash-Script Datei mit Python zu erzeugen, welche dann die Variable an das andere Bash-script übergibt und die Passwortabfrage übernehmen würde.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du kannst aber auch versuchen, dein gesamtes Environment bei env mit einzupacken und dann nur um die Variablen die du brauchst zu ergänzen. Ist warscheinlich sowieso schlauer.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Ubuntuxer
User
Beiträge: 42
Registriert: Donnerstag 17. April 2008, 15:49

Tut mir leid, aber ich verstehe nicht was du mit Environment meinst. :(
Antworten