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!
Pluginanbindung über Kommandozeile oder auch anders
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.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo RedSharky!RedSharky hat geschrieben:wie ich ein Python-Programm schreiben muss, damit es die Daten übernimmt.
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()
Code: Alles auswählen
sys.stdout.write("Hallo Welt\n")
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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:
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).
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
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).
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.
Und nur zur Sicherheit: In Zeile 12 wird nichts transferiert, da wird den Daten einfach nur noch ein zusätzlicher Name gegeben.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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 (former) Modvoice