Ich möchte zwei Dateien aneinander kleben und diese dann mit einem anderen Programm weiter verarbeiten...
Kann ich mittles einer Pipe zwei Dateien zu einer virtuellen Datei zusammen bateln, sodas ich mit der Weiterverarbeitung ohne eine TEMP-Datei auskommen kann???
mittels pipe eine Virtuelle Datei erstellen???
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Hi jens,
wenn es in der selben Anwendung ist, warum nicht mit Iteratoren. Im Modul [url=http://www.python.org/doc/current/lib/i ... tions.html]itertools[/b] gibt es dafür recht interessante Funktionen. Mit itertools.chain(*iterables) kannst Du einfach nacheinander über mehrere Dateien zeilenweise iterieren, als währen die aneinander gehängt.
Ansonst kannst Du dir auch einen eigenen Iterator basteln, Beispiele findest du auch in der Doku zu itertools.
Gruß
Dookie
wenn es in der selben Anwendung ist, warum nicht mit Iteratoren. Im Modul [url=http://www.python.org/doc/current/lib/i ... tions.html]itertools[/b] gibt es dafür recht interessante Funktionen. Mit itertools.chain(*iterables) kannst Du einfach nacheinander über mehrere Dateien zeilenweise iterieren, als währen die aneinander gehängt.
Ansonst kannst Du dir auch einen eigenen Iterator basteln, Beispiele findest du auch in der Doku zu itertools.
Gruß
Dookie
[code]#!/usr/bin/env python
import this[/code]
import this[/code]
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Nein, die "virtuelle" Datei soll ja von einem anderen Programm aus weiter verarbeitet werden... Das kann ich natürlich auch von meinem Python Skript aus starten...
Ahja, die Dateien sind auch sehr groß so ca. 100MB das Stück...
Ahja, die Dateien sind auch sehr groß so ca. 100MB das Stück...
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Ich hab da mal nen Codeschnipsel aus einem meiner Scripts:
Hier wird eine Anwendung, im konkreten Fall Povray gestartet und dessen Ausgabe in einer (Gnome-)Statusbar angezeigt.
Umgekehrt vom Script an eine Anwendung etwas schicken ginge natürlich auch, vorausgesetzt die Anwendung kann Daten von stdin verarbeiten. Sonst müsstest Du doch etwas mit Pipes machen, wie das unter Windows geht, hab ich leider keine Ahnung. Unter Linux kann man Pipes wie normale Dateien öffnen, man sollte nur von Zeit zu Zeit ein pipe.flush() machen, damit der interne Puffer auch in die Pipe geschrieben wird, sonst bekommt die Anwendung unter Umständen die Daten erst, wenn die Pipe geschlossen wird.
Gruß
Dookie
Code: Alles auswählen
os.chdir(os.path.dirname(self.options.fname))
povray = popen2.Popen4("nice -n10 %s %s" % (povini.POV_EXE,
self.options.fname),1)
buf = []
while povray.poll() == -1:
povray.fromchild.flush()
ch = povray.fromchild.read(1)
if ch not in "\n\r":
buf.append(ch)
if len(buf) >= 23 and "".join(buf).startswith("Click"):
self.write_status("".join(buf))
else:
line = "".join(buf).strip()
if line:
self.write_status(line)
if "Rendering line" in line:
linenrs = re.findall(r'(\d+)\s*of\s*(\d+)', line)[0]
percent = float(linenrs[0])/float(linenrs[1])
statusbar.set_progress_percentage(percent)
buf = []
while gtk.events_pending():
gtk.main_iteration_do(False)
statusbar.set_progress_percentage(0.0)
Umgekehrt vom Script an eine Anwendung etwas schicken ginge natürlich auch, vorausgesetzt die Anwendung kann Daten von stdin verarbeiten. Sonst müsstest Du doch etwas mit Pipes machen, wie das unter Windows geht, hab ich leider keine Ahnung. Unter Linux kann man Pipes wie normale Dateien öffnen, man sollte nur von Zeit zu Zeit ein pipe.flush() machen, damit der interne Puffer auch in die Pipe geschrieben wird, sonst bekommt die Anwendung unter Umständen die Daten erst, wenn die Pipe geschlossen wird.
Gruß
Dookie
[code]#!/usr/bin/env python
import this[/code]
import this[/code]
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Also wenn ich es mir recht überlege, könnte ich es auch unter Linux anwerden, wenn ich auf die Pipe-Datei per Samba von Windows dran komme???
Also ich pack zwei Dateien mit Python auf dem Linux-Rechner zu einer virtuellen-Pipe-Datei in einem Verz. welches mit Samba freigegeben ist...
Geht das so?
Hast du dafür vielleicht Beispiele???
Mal zur Veranschaulichung:
Also ich pack zwei Dateien mit Python auf dem Linux-Rechner zu einer virtuellen-Pipe-Datei in einem Verz. welches mit Samba freigegeben ist...
Geht das so?
Hast du dafür vielleicht Beispiele???
Mal zur Veranschaulichung:
Code: Alles auswählen
PipeFile = "/tmp/PipeFile.txt"
SourceFile1 = "/daten/file1.txt"
SourceFile2 = "/daten/file2.txt"
os.mkfifo(PipeFile)
s1 = os.open( SourceFile1, "r" )
s2 = os.open( SourceFile2, "r" )
p = os.open( PipeFile, "w+" )
# Geht natürlich nicht so:
p = s1 + s2
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Hi jens,
Gruß
Dookie
Code: Alles auswählen
PipeFile = "/tmp/PipeFile.txt"
SourceFile1 = "/daten/file1.txt"
SourceFile2 = "/daten/file2.txt"
os.mkfifo(PipeFile)
s1 = os.open( SourceFile1, "r" )
s2 = os.open( SourceFile2, "r" )
p = os.open( PipeFile, "w+" )
# Geht natürlich so:
for line in s1:
p.write(line)
s1.close()
for line in s2:
p.write(line)
s2.close()
p.close()
Gruß
Dookie
[code]#!/usr/bin/env python
import this[/code]
import this[/code]
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Hmmmm... So einfach geht das???
Aber funktioniert das auch so, als virtuelle Datei???
Gehen wir mal von aus das SourceFile1 und SourceFile2 jeweils 1GB groß sind. Geht das Skript dann nicht hin und schreibt direkt die Daten per Pipe in die Datei PileFile, die somit 2GB Plattenplatz benötigt???
Ich bescheib noch mal das was ich haben möchte:
Die beiden Dateien sollen zu einer virtuellen Datei zusammen gefügt werden, die aber nicht wirklich Plattenplatz belegt. Dennoch kann ich mit einem zweiten Skript diese virtuelle Datei als ganz normale Datei lesen...
Geht das überhaupt?
Aber funktioniert das auch so, als virtuelle Datei???
Gehen wir mal von aus das SourceFile1 und SourceFile2 jeweils 1GB groß sind. Geht das Skript dann nicht hin und schreibt direkt die Daten per Pipe in die Datei PileFile, die somit 2GB Plattenplatz benötigt???
Ich bescheib noch mal das was ich haben möchte:
Die beiden Dateien sollen zu einer virtuellen Datei zusammen gefügt werden, die aber nicht wirklich Plattenplatz belegt. Dennoch kann ich mit einem zweiten Skript diese virtuelle Datei als ganz normale Datei lesen...
Geht das überhaupt?
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Hi Jens,
du startest, nach dem erstellen mit mkfifo, die zweite Anwendung, die dann aus der pipe gleich liest, bzw. darauf wartet, daß es Daten aus der pipe bekommt. wenn du dann zeilenweise deine Daten reinschreibst, bekommt diese Anwendung die Daten auch Zeilenweise, bis die pipe wieder geschlossen wird.
Gruß
Dookie
du startest, nach dem erstellen mit mkfifo, die zweite Anwendung, die dann aus der pipe gleich liest, bzw. darauf wartet, daß es Daten aus der pipe bekommt. wenn du dann zeilenweise deine Daten reinschreibst, bekommt diese Anwendung die Daten auch Zeilenweise, bis die pipe wieder geschlossen wird.
Gruß
Dookie
[code]#!/usr/bin/env python
import this[/code]
import this[/code]
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Mal anders gefragt... Wenn ich mit mkfifo eine virtuelle Datei in einem Verzeichniss erstelle, welches per Samba freigegeben ist... Kann dann jedes x-beliebige Windows Programm auf diese Datei zugreifen, als wäre es eine echte???
OK, hab mir jetzt mal was gebastelt:
Wenn ich nun die Datei von Windows aus öffne, sehe ich, das das Python Skript die "Daten" schreibt... Es wird bis 10 hochgezählt... Jedoch erhalte ich auf der anderen Seite nur eine leere Datei, wenn ich diese mit Notepad öffne...
EDIT: Also wenn ich auf dem Linux Rechner die Datei öffne, dann ist alles richtig...
Heißt das, man kann es nicht durch Samba sharen???
OK, hab mir jetzt mal was gebastelt:
Code: Alles auswählen
import os
os.mkfifo( "/daten/fifofile.dat" )
f = file(fifoFile, "w")
for i in range( 10 ):
print i
f.write( str(i) )
EDIT: Also wenn ich auf dem Linux Rechner die Datei öffne, dann ist alles richtig...
Heißt das, man kann es nicht durch Samba sharen???
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Hast du vielleicht bemerkt, dass man mit ls -l herausbekommt, dass das keine normale Datei sondern ein FIFO ist? Das funktioniert genausowenig wie wenn du versuchen würdest Gerätedateien über Samba freizugeben.jens hat geschrieben:Wenn ich nun die Datei von Windows aus öffne, sehe ich, das das Python Skript die "Daten" schreibt... Es wird bis 10 hochgezählt... Jedoch erhalte ich auf der anderen Seite nur eine leere Datei, wenn ich diese mit Notepad öffne...
EDIT: Also wenn ich auf dem Linux Rechner die Datei öffne, dann ist alles richtig...
Heißt das, man kann es nicht durch Samba sharen???
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Mir ist schon klar, das es eine FIFO-Datei ist... Schade nur, das man diese nicht über Samba ansprechen kann... Ich dachte das geht...
Gibt es keine Möglichkeit FIFOs unter Windows zu machen?
Gibt es keine Möglichkeit FIFOs unter Windows zu machen?