Subprocesses in Python

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
arakes
User
Beiträge: 2
Registriert: Donnerstag 23. Oktober 2008, 14:27

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 ?
BlackJack

Ist an den Dateien irgend etwas besonderes? Zum Beispiel am Dateinamen? Kann man dem Programm keine präzisere Fehlermeldung entlocken?
arakes
User
Beiträge: 2
Registriert: Donnerstag 23. Oktober 2008, 14:27

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).
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'
farid
User
Beiträge: 95
Registriert: Mittwoch 8. Oktober 2008, 15:37

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
Antworten