Seite 1 von 1

Subprocesses in Python

Verfasst: Donnerstag 23. Oktober 2008, 14:47
von arakes
Hi,
ich muss ein Programm mehrere tausend mal für unterschiedliche Input-Dateien aufrufen und habe versucht das durch ein Python-Skript zu machen. Das Problem ist, für ca. 1/3 aller Dateien funktioniert der Aufruf nicht (das Programm beschwert sich über fehlerhafte Input-Dateien - wenn ich das Programm ganz normal, ohne Python-wrapper, aufrufe, funktioniert alles ohne Probleme...). Der Fehler ist reproduzierbar, es sind immer die selben Input-Dateien für die der Aufruf nicht funktioniert.
Ich habe es bislang mit os.system() und subprocess.Popen() versucht:

os.system("formatdb -i " + filename)
subprocess.Popen(["formatdb", "-i", filename]).wait()

hat irgendjemand eine Idee was dieses seltsame Programmverhalten verursachen könnte ?

Verfasst: Donnerstag 23. Oktober 2008, 15:45
von BlackJack
Ist an den Dateien irgend etwas besonderes? Zum Beispiel am Dateinamen? Kann man dem Programm keine präzisere Fehlermeldung entlocken?

Verfasst: Donnerstag 23. Oktober 2008, 16:13
von arakes
Die Fehlermeldung die auftaucht sieht so aus:
[formatdb] WARNING: Cannot add sequence number 246 (lcl|246_profiles/Pfam-B_34) because it has zero-length.

Wie gesagt, wenn ich das Programm ganz normal aufrufe (also in diesem Fall einfall in der Shell "formatdb -i profiles/Pfam-B_34" ausführe) funktioniert es ohne Probleme (die Fehlermeldung ist für mich unverständlich denn es gibt keine "sequence with zero-length" in dieser oder irgendeiner anderen Datei).

Verfasst: Donnerstag 23. Oktober 2008, 16:36
von BlackJack
Und wenn Du stattdessen folgendes in der Shell eingibst, geht's nicht!?

Code: Alles auswählen

python -c 'import os; os.system("formatdb -i profiles/Pfam-B_34")'
Wie sieht's hiermit aus?

Code: Alles auswählen

sh -c 'formatdb -i profiles/Pfam-B_34'

subprocess Modul bei Python 2.6

Verfasst: Montag 27. Oktober 2008, 15:53
von farid
Bei os.system sollte man etwas vorsichtig sein, besonders wenn die Argumente des aufzurufenden Programms von Aussen kommen (injection vulnerabilities).

Es gibt das 'subprocess' Modul:

http://docs.python.org/library/subprocess.html

Insbesondere:

http://docs.python.org/library/subproce ... -os-system