Pluginanbindung über Kommandozeile oder auch anders

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.
RedSharky
User
Beiträge: 99
Registriert: Donnerstag 13. April 2006, 15:38

Pluginanbindung über Kommandozeile oder auch anders

Beitragvon RedSharky » Samstag 25. August 2007, 20:20

Hallo,

ich nutze das frei verfügbare Bioedit ( http://www.mbio.ncsu.edu/BioEdit/bioedit.html) um DNA-Sequenzen zu bearbeiten. Fehlende Funktionen kann man über externe Programme nachrüsten. Laut Dokumentation sollen diese am besten Kommandozeilenprogramme sein, welche die entsprechenden Sequenzen als Text übergeben bekommen, bearbeiten und das Ergebnis, wiederum als Text, an Bioedit zurückgeben. Etliche mitgelieferte Zusatzprogramme zeigen, dass es prinzipiell funktioniert.

Nun dachte ich mir, dass man solche Erweiterungen doch auch mit Python schreiben könnte. Für die Anbindung stellt Bioedit einen Dialog zur Verfügung ( http://www.mbio.ncsu.edu/BioEdit/shot9.gif), in dem man die nötigen Einstellungen vornehmen kann, um das externe Programm anzusprechen. Ein py-File kann man damit leicht starten.

Nun stellt sich aber für mich das Problem dar, wie ich ein Python-Programm schreiben muss, damit es die Daten übernimmt. Kann mir da jemand einen Tipp geben?
Bei den dort (siehe Abbildung) zu übergebenen Dateiformaten (Fasta, usw.) handelt es sich wie gesagt immer nur um Text, der per Kommandozeile (oder stdin/stdout?) übergeben werden soll.

Ich bedanke mich schon mal, für jeden tollen Tipp!
BlackJack

Beitragvon BlackJack » Samstag 25. August 2007, 20:28

Das ist letztendlich keine Python-Frage sondern wie BioEdit mit anderen Programmen kommuniziert. Lies Dir die Doku für den Dialog aus dem Scrennshot durch. Vermutlich kann man sowohl über Dateien als auch über Standardein- und ausgabe mit externen Programmen kommunizieren. Es scheint für beides Felder und Checkboxen in dem Dialog zu geben.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Pluginanbindung über Kommandozeile oder auch anders

Beitragvon gerold » Samstag 25. August 2007, 21:32

RedSharky hat geschrieben:wie ich ein Python-Programm schreiben muss, damit es die Daten übernimmt.

Hallo RedSharky!

Mit ``sys.argv`` bekommst du eine Liste mit den Kommandozeilenparametern übergeben. ``sys.argv[0]`` ist der Programmname selbst. Mit dem Modul optparse kannst du die Kommandozeile parsen, falls du viele verschiedene Optionen und Argumente auswerten möchtest.

Mit ``sys.stdin`` bekommst du ein dateiartiges Objekt, das von STDIN lesen kann.

Code: Alles auswählen

import sys
for line in sys.stdin:
    print line.rstrip()

Mit ``print`` oder ``sys.stdout`` kannst du etwas nach STDOUT schreiben. ``print`` hängt zusätzlich ein "\n" (Zeilenumbruch) an.

Code: Alles auswählen

sys.stdout.write("Hallo Welt\n")

mfg
Gerold
:-)

PS: Und hier noch ein zwei Links:

- http://python.genedrift.org/category/section-5/
- http://python.genedrift.org/2007/07/04/ ... a-files-2/
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
RedSharky
User
Beiträge: 99
Registriert: Donnerstag 13. April 2006, 15:38

Beitragvon RedSharky » Samstag 25. August 2007, 23:51

Vielen Dank für eure Antworten! Die haben doch glatt das Problemchen gelöst.

Ich habe es gleich mal mit sys.argv probiert. Nach diesem Stichwort war alles ganz einfach.

BioEdit liefert nämlich mit sys.argv[1] den Pfad zu einem File im temp-Ordner von BioEdit, welches die exportierten Sequenzen enthält. Ebenso kommt man mit sys.argv[2] an das File, das BioEdit zurückerwartet.

Also habe ich folgendes (noch ausbaufähiges) Skript geschrieben:

Code: Alles auswählen

import sys

#get file paths
infile_path = sys.argv[1]
outfile_path = sys.argv[2]

#read sequence data form input file
infile = file(infile_path,'r')
infile_cont = infile.read()

#do nothing, simply transfer content from infile to outfile
outfile_cont = infile_cont
print outfile_cont

#write data back to output file (that will be opened by BioEdit afterwards)
outfile = file(outfile_path,'w')
outfile.write(outfile_cont)
outfile.close()

print "End of script. Press ENTER to continue..."
raw_input() #wait until Enter is pressed


In BioEdit braucht man dann in besagtem Konfigurationsdialog (außer dem Pfad zum Skript) nur noch folgende Einstellungen vornehmen:
Auto-feed seqs: True
Add input file to command line: at end
Add output file to command line: at end
Input name -> Arbitrary: True (bei command line formatting for input and output)
Output name -> Arbitrary: True (bei command line formatting for input and output)
Open as alignment: True

Die andere Möglichkeit mit stdin/stdout werde ich mir aber auch noch mal anschauen (und hoffentlich was lernen).
BlackJack

Beitragvon BlackJack » Sonntag 26. August 2007, 07:58

Für ein sauberes Programm fehlt ein ``infile.close()``.

Und nur zur Sicherheit: In Zeile 12 wird nichts transferiert, da wird den Daten einfach nur noch ein zusätzlicher Name gegeben.
RedSharky
User
Beiträge: 99
Registriert: Donnerstag 13. April 2006, 15:38

Beitragvon RedSharky » Sonntag 26. August 2007, 09:55

@BlackJack: Danke, wird sofort umgesetzt.

@gerold: Und vielen Dank nochmal für die Links.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 26. August 2007, 10:16

Das ``raw_input()`` wird aber auch nur ausgeführt, wenn der Code problemlos durchläuft. Du solltest besser eine stabiliere Enter-on-quit-Lösung verwenden, beispielsweise eben die die ich in dem Post vorgestellt habe.
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder