2009-05-22 10 views
4

L'API C dans Python 3.0 a modifié (obsolète) la plupart des fonctions des objets de fichier.Fichier d'E/S dans l'API Python 3 C

Avant, 2.x, vous pouvez utiliser

PyObject* PyFile_FromString(char *filename, char *mode) 

pour créer un objet fichier Python, par exemple:

PyObject *myFile = PyFile_FromString("test.txt", "r"); 

... mais cette fonction n'existe plus en Python 3.0. Quel serait le Python 3.0 équivalent à un tel appel?

Répondre

5

Vous pouvez le faire de la manière traditionnelle (nouvelle?), En appelant simplement le module io.

Ce code fonctionne, mais il ne vérifie pas les erreurs. Voir les documents pour l'explication.

PyObject *ioMod, *openedFile; 

PyGILState_STATE gilState = PyGILState_Ensure(); 

ioMod = PyImport_ImportModule("io"); 

openedFile = PyObject_CallMethod(ioMod, "open", "ss", "foo.txt", "wb"); 
Py_DECREF(ioMod); 

PyObject_CallMethod(openedFile, "write", "y", "Written from Python C API!\n"); 
PyObject_CallMethod(openedFile, "flush", NULL); 
PyObject_CallMethod(openedFile, "close", NULL); 
Py_DECREF(openedFile); 

PyGILState_Release(gilState); 
Py_Finalize(); 
+1

N'y a-t-il pas d'autre moyen de le faire? Cela semble assez lourd par rapport à l'exemple montré dans la question. – lorenzog

3

This page affirme l'API est:

PyFile_FromFd(int fd, char *name, char *mode, int buffering, char *encoding, char *newline, int closefd); 

Je ne sais pas si cela signifie qu'il est impossible d'avoir Python ouvrir le fichier à partir du nom de fichier, mais cela devrait être trivial à vous faire, en C.

Questions connexes