FILE pointer 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
ede
User
Beiträge: 20
Registriert: Samstag 18. November 2006, 10:38

hab mich im forum schonmal ein bisschen umgesehn aber konnte leider keine konkrete antwort auf die frage finden: wie kann man mit den file pointern aus C in python hantieren? ich habe die funktion bereits in eine dll umgewandelt. man muss der funktion 2 parameter übergeben, wobei der erste FILE *file heisst. habe bei einem beitrag folgende versuche gesehn:

erste Variante

Code: Alles auswählen

import ctypes
c=ctypes.cdll.LoadLibrary("file.dll")
f=file(r"C:\text.txt","r")
p=ctypes.pointer(f)
zweite Variante

Code: Alles auswählen

import os
import ctypes
c=ctypes.cdll.LoadLibrary("file.dll")
o=os.open(r"C:\text.txt",1)
hier wird ein dateideskriptor zurückgegeben, wobei ich nicht genau weiss was damit gemeint ist, genausowenig wie ich weiss was der zweite parameter von os.open bedeutet...

und vor allem: wie gehts hier dann weiter? wenn ich

Code: Alles auswählen

print c.func(o,1)
eingebe, dann kommt windows error: access violation...
BlackJack

ede hat geschrieben:wie kann man mit den file pointern aus C in python hantieren?
Die Antwort wird wohl: "Gar nicht." lauten. Ausser das Du einen solchen Pointer als `void*` via `ctypes` von einer C Funktion bekommst und ihn dann einer anderen gibst kann Python damit nichts anfangen.
ich habe die funktion bereits in eine dll umgewandelt. man muss der funktion 2 parameter übergeben, wobei der erste FILE *file heisst. habe bei einem beitrag folgende versuche gesehn:

[...]

zweite Variante

Code: Alles auswählen

import os
import ctypes
c=ctypes.cdll.LoadLibrary("file.dll")
o=os.open(r"C:\text.txt",1)
hier wird ein dateideskriptor zurückgegeben, wobei ich nicht genau weiss was damit gemeint ist, genausowenig wie ich weiss was der zweite parameter von os.open bedeutet...
Ein Dateideskriptor ist eine Zahl die zusammen mit einer Prozess-ID eine offene Datei bestimmt. Das heisst so ein Deskriptor hat nur in einem laufendem Prozess eine Bedeutung und kann nicht an einen anderen weitergegeben werden.

`os.open()` entspricht der `open()` Funktion bei POSIX. Die Bedeutung des zweiten Arguments kannst Du in der entsprechenden Dokumentation zur C-Funktion oder in der zum `os`-Modul nachlesen. Und man sollte lieber die Konstanten benutzen statt konkrete Zahlen.
und vor allem: wie gehts hier dann weiter? wenn ich

Code: Alles auswählen

print c.func(o,1)
eingebe, dann kommt windows error: access violation...
Weil Du versuchst eine positive Zahl als Pointer zu verwenden. Du müsstest auf der C-Seite einen Dateideskriptor entgegennehmen und dann entweder die POSIX-Funktionen benutzen oder Dir mit `fdopen()` einen `FILE*`-Pointer zu der Datei geben lassen.
ede
User
Beiträge: 20
Registriert: Samstag 18. November 2006, 10:38

mal schauen ob ich den letzten vorschlag umsetzten kann aber trotzdem danke! :wink:
ede
User
Beiträge: 20
Registriert: Samstag 18. November 2006, 10:38

also bei mir klappts immer noch nicht!
ich schreib mal sowohl den C (vereinfacht), als auch den Python Code hin:

Code: Alles auswählen

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int func(int descr)
{
FILE *f=fdopen(descr,"r");
return getc(f);
};

int main()
{
FILE *file=fopen("C:\\text.txt","r");
if (file==NULL) exit(1);
printf("%d\n\n",func(fileno(file)));
system("PAUSE");
};

Code: Alles auswählen

import ctypes
import os
O_RDONLY=33
c=ctypes.cdll.LoadLibrary("func.dll")
o=os.open("C:\\text.txt",O_RDONLY)
print c.func(o)
os.close(o)
dannach wird immer mein Editor (PyScripter) geschlossen ohne fehlermeldung...
und noch was: seh ich das richtig, dass ich O_RDONLY zuerst selbst definieren muss?
BlackJack

ede hat geschrieben:und noch was: seh ich das richtig, dass ich O_RDONLY zuerst selbst definieren muss?
Nein, die Konstanten sind in `os` definiert. Wie kommst Du auf die 33?
ede
User
Beiträge: 20
Registriert: Samstag 18. November 2006, 10:38

BlackJack hat geschrieben:
ede hat geschrieben: und noch was: seh ich das richtig, dass ich O_RDONLY zuerst selbst definieren muss?
Nein, die Konstanten sind in `os` definiert. Wie kommst Du auf die 33?
keine ahnung is mir halt so eingefallen :D ...
und weil

Code: Alles auswählen

import os
print O_RDONLY
bei mir immer "O_RDONLY is not defined" ausspuckt und weil ich innem wxPython tut dinge wie ID_CLOSE auch zuerst selbst definieren musste.

aber zum eigentlichen thema...

wenns so nicht klappt, sollte ich dann besser die datei im C modul oeffnen und den fildescriptor an python zurueckgeben?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

ede hat geschrieben:
BlackJack hat geschrieben:
ede hat geschrieben: und noch was: seh ich das richtig, dass ich O_RDONLY zuerst selbst definieren muss?
Nein, die Konstanten sind in `os` definiert. Wie kommst Du auf die 33?
keine ahnung is mir halt so eingefallen :D ...
Keine weiteren Fragen, Euer Ehren...
und weil

Code: Alles auswählen

import os
print O_RDONLY
bei mir immer "O_RDONLY is not defined" ausspuckt
Du solltest dir mal [wiki]Import[/wiki] durchlesen.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
ede
User
Beiträge: 20
Registriert: Samstag 18. November 2006, 10:38

birkenfeld hat geschrieben: Du solltest dir mal Import durchlesen.

Code: Alles auswählen

from os import O_RDONLY as RO
;)

ich würd das ganze gern noch ein letztes mal aufwärmen weil ein erfolg immer noch auf sich warten laesst. hier hab ich nochmal die codes

getc für python:

Code: Alles auswählen

#include <conio.h>
#include <stdio.h>

int getc_py(int fd)//filedeskriptor wird übergeben
{
    FILE *f=fdopen(fd,"r");
    return getc(f);
};

Code: Alles auswählen

from os import O_RDONLY as RO
import os
import ctypes
c=ctypes.cdll.LoadLibrary("getc_py.dll")
o=os.open("C:"+os.sep+"text.txt",RO)
print c.getc_py(o)
os.close(o)
wenn man beide codes in python bzw C schreibt gibts keine probleme, nur dann, wenn ich das C modul in python einbinde aber warum?

und ich hätt da noch ne frage: kann ich mit mingw auch in cpp geschriebene module einbauen bzw wie mach ich da draus eine dll?
BlackJack

Es wird Dir wahrscheinlich nicht viel helfen, aber bei mir funktioniert's.

Wie äussert sich denn bei Dir das nichtfunktionieren genau? Gibt's 'ne Fehlermeldung auf der Konsole?
Antworten