Seite 1 von 1

Anfängerfrage

Verfasst: Freitag 24. Juni 2011, 14:22
von uwerothfeld
Hallo zusammen,

ich versuche gerade mein erstes Py-Skript zu erstellen. Warum geht:

Code: Alles auswählen

def extractAttributes():
    simPath="~/source/simulations"
    simResultPath=simPath+"/results"
    source = "source ~/omnet-setup.export"
    scaveCommand = "scavetool"
    scaveOptionListUniqueStatNames="l -n " 
    scave = source + " && " + scaveCommand + " " + scaveOptionListUniqueStatNames +" "+ simResultPath +"/Sim-0.vec"
    proc = subprocess.Popen([scave], shell=True, stdout=subprocess.PIPE)
aber nicht:

Code: Alles auswählen

...
    proc = subprocess.Popen([scave], stdout=subprocess.PIPE)
...
????
Der Fehler ist:

Code: Alles auswählen

Traceback (most recent call last):
  File "simulations/prepareAndExtractStatsData.py", line 35, in ?
    main()
  File "simulations/prepareAndExtractStatsData.py", line 22, in main
    extractAttributes()
  File "simulations/prepareAndExtractStatsData.py", line 31, in extractAttributes
    (pIn, pOut) = subprocess.Popen([scave], stdout=subprocess.PIPE,stderr=subprocess.PIPE).communicate()
  File "/usr/lib64/python2.4/subprocess.py", line 550, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.4/subprocess.py", line 996, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

Danke.
Gruß

Re: Anfängerfrage

Verfasst: Freitag 24. Juni 2011, 14:57
von cofi
Ad 1) Schau dir mal an, was `shell=True` macht und dann suchst du mal im Forum nach subprocess. Dein Aufruf kann aber ohne `shell=True` nicht funktionieren, weil du da lauter Shell-Befehle nutzt, z.b. `source` und `&&`.

Ad 2) Weil `communicate` ein Paar von `stdout, stderr` zurueckgibt, nicht von `stdin, stdout`. Ersteres macht auch keinen Sinn, weil die Eingabe ja `communicate` uebergeben wird.

Re: Anfängerfrage

Verfasst: Freitag 24. Juni 2011, 16:57
von Newcomer
Hey Cofi, ist dein Bild nicht eine "Lebensform" aus Conways game of live??

Re: Anfängerfrage

Verfasst: Montag 27. Juni 2011, 09:12
von uwerothfeld
Hey cofi,

also erst einmal dank. Die Ausgaben bekomme ich nun zurück. Dennoch verstehe ich nicht, warum shell=FALSE nicht geht. Ok, statt direkt an die Shell das Kommando weiter zureichen wie bei Shell=True, wird es an os.exec weitergeben, welches einen vernünftigen Path verlangt. Wie kann ich dann die Path-Variable manipulieren? Da scheint mir ja das Problem zu liegen. Oder geht es nicht?

Gruß, uwe

Re: Anfängerfrage

Verfasst: Montag 27. Juni 2011, 09:18
von snafu
Nee, da stecken auch noch ein paar andere Dinge drin, die nur von einer Shell interpretiert werden können, wie cofi ja auch bereits gesagt hat.

Re: Anfängerfrage

Verfasst: Montag 27. Juni 2011, 09:28
von cofi
@uwerothfeld: Nein, keine Chance. Es wird nach dem Programm `source ~/omnet... && ...` gesucht, am Pfad zu rütteln bringt hier nichts.

Den `source`-Aufruf solltest du duch ein geeignetes Dictionary loswerden, dass du dann im `Popen`-Aufruf als `env` uebergibst.
Dann musst du noch den langen String aufteilen: Ohne Shell benötigst du eine Liste von Argumenten, also üblicherweise da, wo du jetzt ein Leerzeichen hast.

@Newcomer: Nicht das ich wüsste, es ist aber an den Glider aus Life angelehnt. Das ist aber arg Offtopic ;)

Re: Anfängerfrage

Verfasst: Montag 27. Juni 2011, 09:51
von snafu
Ich würde mir die Mühe gar nicht erst machen und einfach `shell=True` stehen lassen. Wenn man gewisse Shell-Funktionalität nunmal benötigt, dann kann man IMHO auch ruhig eine Shell aufrufen, anstatt das selbst zu implementieren. Solange keine Eingaben von "außen" kommen, ist dieses Vorgehen auch recht sicher. Anstatt der Leerzeichen würde ich aber wahrscheinlich eine Liste nehmen und diese ggf mittels `' '.join(args)` übergeben, falls sie bei `shell=True` nicht richtig interpretiert wird.

Re: Anfängerfrage

Verfasst: Montag 27. Juni 2011, 13:49
von uwerothfeld
alles klar. vielen Dank für Eure Hilfe :)