[Geklärt]Wie genau impl. man einen file descriptor (fileno)?
Verfasst: Sonntag 28. Januar 2007, 12:52
Hi.
Es geht um folgendes:
Wenn an ``stdin`` subprocess.PIPE übergeben wird, dan wird der Output vom ``'testScript.py'`` ungepufert ausgegeben (Also nicht erst wenn der Prozess Terminiert wurde).
subprocess.PIPE ist ein file descriptor, der dem Stream(?) PIPE zugewiesen ist bzw. assoziert wird (wie auch immer).
So nun ist die Frage wie ich so einen eigenen Stream (Pseudo-File) schreiben mit einem file descriptor?
Ein Pseudo-File habe ich schon mal kurz zusammengehackt:
Das funktioniert auch soweit. Nun muss ich aber die Methode ``fileno`` implementieren, die mir einen file descriptor zurückliefert der aber auch irgendwo "registriert ist" intern (In den tiefen von Python), damit ``subprocess.Popen`` weiß wo er seine Output ausgeben soll -- ``subprocess.Popen`` Kann mit ``std*`` was anfangen und auch mit Objekten die mit ``file`` erzeugt wurden sind, da die ``fileno`` implementiert haben...Jetzt muss es irgendwo was magisches geben mit dem ich auch sowas auch machen kann oder?
Leider ist mein Wissen über das File-System beschränkt und weiß daher nicht wie man sowas realisiert.
lg
sape
Code: Alles auswählen
In [10]: file.fileno??
Type: method_descriptor
Base Class: <type 'method_descriptor'>
String Form: <method 'fileno' of 'file' objects>
Namespace: Python builtin
Docstring [source file open failed]:
fileno() -> integer "file descriptor".
This is needed for lower-level file interfaces, such os.read().
Code: Alles auswählen
process = subprocess.Popen(
('python', 'testScript.py'),
shell = True,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE,
stdin = subprocess.PIPE
)
subprocess.PIPE ist ein file descriptor, der dem Stream(?) PIPE zugewiesen ist bzw. assoziert wird (wie auch immer).
Code: Alles auswählen
# subprocess.py
PIPE = -1
STDOUT = -2
Ein Pseudo-File habe ich schon mal kurz zusammengehackt:
Code: Alles auswählen
[...]
class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, parent=None, title="Test")
[...]
# Für die jenigen die sich mit wxPython nicht auskennen:
# Das ist ein Textfeld in den Texte eingeben werden könne wie mit
# MS Notepad.
self.txt_ctrl = wx.TextCtrl(self.panel, style=wx.TE_MULTILINE)
[...]
def OnRunScript(self, event=None):
import wx.py.pseudo
class PseudoFileOut(wx.py.pseudo.PseudoFileOut):
def __init__(self, txt_ctrl_ref):
self.txt_ctrl_ref = txt_ctrl_ref
def write(self, t):
# Es wird alles ins ``wx.TextCtrl`` Textfeld geschrieben.
print >> self.txt_ctrl_ref, t
pfo = PseudoFileOut(self.txt_ctrl)
pfo.write("test")
[...]
Leider ist mein Wissen über das File-System beschränkt und weiß daher nicht wie man sowas realisiert.
lg
sape