In subprocess-shell was schreiben, bevor subprocess loslegt

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.
Antworten
ivka_sto
User
Beiträge: 63
Registriert: Dienstag 11. Dezember 2007, 23:13

Dienstag 17. März 2009, 17:37

Hallo zusammen,


Ich habe nach nem ähnlichen Thema gesucht, aber leider nichts gefunden.
Ich will subprocess mit shell = True aufrufen, doch bevor das Programm startet, das ich als subprocess öffnen will, will ich in genau dieser Shell noch ne EnvVariable ändern. Das geht nicht, oder? Ich müßte mit jeder neu geöffneten Shell die PATH-Variable ändern, wie kann ich das machen, wenn ich eine Shell mit nem subprocess ins Leben rufe? Jemand ne Idee?

Danke schonmal.
Viele Grüße,
ivka_sto

P.S. Bitte fangt jetzt nicht an, mich davon zu überzeugen, daß es ohne Shell besser wäre, weil ich die Shell brauche. Ich weiß es ist schöner und echter ohne usw, doch ich mach's mit :D Und ich habe nicht genügend Rechte (glaube ich), um die PATH-Variable global zu ändern, bzw. muß mein Code unabhängig sein vom Rechner, an dem ich es aufrufe (weil ich nicht wisse, ob der, der als Nächster mein Programm benutzt, die PATH-Variable wird ändern können)
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Dienstag 17. März 2009, 17:45

Was spricht gegen:

Code: Alles auswählen

os.environ["PATH"] += new_path
proc = subprocess.Popen(...)
Oder funktioniert das unter Linux nicht?
Unter Windows problemlos...
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Dienstag 17. März 2009, 17:56

Popen akzeptiert ein env-Argument, dem man ein Dictionary mit den gewünschten Environment-Variablen mitgeben kann. Hab das aber selbst nie ausprobiert.
lunar

Dienstag 17. März 2009, 18:21

Im Übrigen könnte man ja auch einfach absolute Pfade nutzen ...
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 17. März 2009, 18:43

ivka_sto hat geschrieben:P.S. Bitte fangt jetzt nicht an, mich davon zu überzeugen, daß es ohne Shell besser wäre, weil ich die Shell brauche. Ich weiß es ist schöner und echter ohne usw, doch ich mach's mit :D
Und warum?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Dienstag 17. März 2009, 19:11

Ich will jetzt mit den Föhn in die Badewanne gehen und möchte den Stecker nicht ziehn. Ich weiß, es ist ungefährlicher ohne Strom, doch ich mach's mit.
BlackJack

Dienstag 17. März 2009, 23:40

@audax: Also ich denke das ist unproblematisch. Nur Wasser solltest Du keines in die Badewanne lassen. ;-)
ivka_sto
User
Beiträge: 63
Registriert: Dienstag 11. Dezember 2007, 23:13

Mittwoch 18. März 2009, 01:04

Danke allerseits.


Nun ja - einer der Gründe ist, daß es läuft, und beim jetzigen Stand ist mir das viel wichtiger, als daß es perfekt sauber programmiert ist. Ich bau lieber das Haus fertig bevor es regnet, als am Fenster zu schrauben, wenn das Haus kein Dach hat. Das andere Programm will die als Liste übergebenen Argumente nicht haben, und ich hab einfach nicht rausfinden können, warum. Ist jetzt auch egal.

@ice2k3:
Das ist es genau, so würde ich die EnvVar in der aktuellen shell ändern, ich öffne das subprocess in einer neuen Shell, und dann muß sie in dieser auch neu gesetzt werden.

@lunar:
Wie weit muß denn der absolute Pfad gehen? Der, den ich jetzt einfüge geht von /opt bis /bin. Der absolute würde dann bis ~ gehen? Sorry für die blöde Frage, hab kein Plan :oops: (ja, ihr dürft jetzt jaulen 'das sieht man auch an deinem Umgang mit dem subprocess')

Viele Grüße :)
BlackJack

Mittwoch 18. März 2009, 07:16

@ivka_sto: Was Du über `os.environ` setzet gilt nicht nur im aktuellen Prozess (der in dem Fall gar keine Shell ist), sondern auch in allen Kindprozessen. Das hättest Du aber auch ziemlich einfach und schnell selber heraus finden können:

Code: Alles auswählen

In [444]: os.environ['FOOBAR'] = '42'

In [445]: os.system('echo $FOOBAR')
42
Out[445]: 0

In [446]: subprocess.call('echo $FOOBAR', shell=True)
42
Out[446]: 0
Und Du solltest echt besser herausfinden warum es ohne Subshell nicht geht und verstehen was Du beim aufteilen der Argumente falsch machst, statt eine unnötige Shell dazwischen zu schalten. Dein Vergleich mit dem Hausbau hinkt. Du schraubst nicht am Fenster, sondern Du fixierst die Dachpappe mit Büroklammern, statt sie ordentlich zu befestigen. ;-)
lunar

Mittwoch 18. März 2009, 10:10

Diese Vergleiche sind ja fast schon poetisch ... :D

Wie dem auch sei, ivka_sto, ich denke, es ist besser, wenn du einmal beschreibst, was genau du erreichen möchtest und welche Programme an welchen Orten du aufrufen möchtest. Ich denke, dann kann dir besser geholfen werden ...
Antworten