FILE object in Python3.0 extension modules

Discussion in 'Python' started by Joachim Dahl, May 29, 2009.

  1. Joachim Dahl

    Joachim Dahl Guest

    In Python2.x, I used PyFile_Check(obj) to check if a parameter was a
    file object.

    Now, in Python3.0 the same object (obtained as open('file.bin','wb'))
    is an
    io.BufferedWriter object.

    How do I perform type checking for such an object in the extension
    module,
    and how do I extract a FILE * object from it? I browsed the C API
    documentation, but
    couldn't find an answer.

    The purpose is to dump the contents of a Python extension type to disk
    as
    binary data using C's fwrite() function.
    Joachim Dahl, May 29, 2009
    #1
    1. Advertising

  2. Joachim Dahl <dahl.joachim <at> gmail.com> writes:
    >
    > How do I perform type checking for such an object in the extension
    > module,
    > and how do I extract a FILE * object from it? I browsed the C API
    > documentation, but
    > couldn't find an answer.


    You use PyObject_IsInstance to test if the object is an instance of io.IOBase.
    Benjamin Peterson, May 29, 2009
    #2
    1. Advertising

  3. En Fri, 29 May 2009 06:52:15 -0300, Joachim Dahl <>
    escribió:

    > In Python2.x, I used PyFile_Check(obj) to check if a parameter was a
    > file object.
    >
    > Now, in Python3.0 the same object (obtained as open('file.bin','wb'))
    > is an
    > io.BufferedWriter object.
    >
    > How do I perform type checking for such an object in the extension
    > module,


    I don't know which is the preferred way to check for a file object in 3.x
    - I hope someone can answer this more precisely. In principle, a file
    inherits from io.IOBase, but this class is defined in io.py and probably
    isn't intended to be used in C code. Other alternatives are _io._IOBase,
    PyIOBase_Type, and io.FileIO/_io.FileIO

    > and how do I extract a FILE * object from it? I browsed the C API
    > documentation, but
    > couldn't find an answer.


    I'd use PyObject_AsFileDescriptor
    http://docs.python.org/dev/py3k/c-api/file.html

    (Notice that the documentation is outdated; the PyFileObject type does not
    exist anymore, and a file isn't a wrapper around a FILE struct either)

    > The purpose is to dump the contents of a Python extension type to disk
    > as
    > binary data using C's fwrite() function.


    From the above, I'd use write() with the file descriptor obtained from
    PyObject_AsFileDescriptor.

    --
    Gabriel Genellina
    Gabriel Genellina, May 30, 2009
    #3
  4. En Fri, 29 May 2009 08:48:26 -0300, Benjamin Peterson
    <> escribió:

    > Joachim Dahl <dahl.joachim <at> gmail.com> writes:
    >>
    >> How do I perform type checking for such an object in the extension
    >> module,
    >> and how do I extract a FILE * object from it? I browsed the C API
    >> documentation, but
    >> couldn't find an answer.

    >
    > You use PyObject_IsInstance to test if the object is an instance of
    > io.IOBase.


    But you have to import the io module first, don't you? That's not usually
    necesary for most built in types -- e.g. PyFloat_Check just checks for a
    float object.

    --
    Gabriel Genellina
    Gabriel Genellina, May 30, 2009
    #4
  5. Gabriel Genellina <gagsl-py2 <at> yahoo.com.ar> writes:
    > But you have to import the io module first, don't you? That's not usually
    > necesary for most built in types -- e.g. PyFloat_Check just checks for a
    > float object.


    Well, in 3.x, file is not longer a builtin type.
    Benjamin Peterson, May 30, 2009
    #5
  6. En Fri, 29 May 2009 23:24:32 -0300, Benjamin Peterson
    <> escribió:

    > Gabriel Genellina <gagsl-py2 <at> yahoo.com.ar> writes:
    >> But you have to import the io module first, don't you? That's not
    >> usually
    >> necesary for most built in types -- e.g. PyFloat_Check just checks for a
    >> float object.

    >
    > Well, in 3.x, file is not longer a builtin type.


    Ok, seems the old "file" type has been demoted and atomized...

    --
    Gabriel Genellina
    Gabriel Genellina, May 30, 2009
    #6
  7. > The purpose is to dump the contents of a Python extension type to disk
    > as binary data using C's fwrite() function.


    This isn't really possible anymore - the Python IO library has stopped
    using stdio. There are a couple of alternatives:

    1. don't use fwrite(3) to write the binary data, but instead use
    PyObject_CallMethod to call .write on the file object.
    2. don't use fwrite(3), but write(2). To do so, fetch the file
    descriptor from the Python file object, and use that. Make sure
    you flush the stream before writing to it, or else you may get
    the data in the wrong order.
    3. use fdopen to obtain a FILE*; the comments for 2) apply.
    In addition, make sure to flush and discard the FILE* before
    letting Python continue to write to the file.

    Regards,
    Martin
    Martin v. Löwis, Jun 3, 2009
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Anand
    Replies:
    3
    Views:
    874
    Tim Daneliuk
    Nov 8, 2003
  2. Steve
    Replies:
    3
    Views:
    26,937
    Steve
    Aug 25, 2006
  3. Andrew Berg
    Replies:
    0
    Views:
    321
    Andrew Berg
    Jun 16, 2012
  4. Mark Heieis
    Replies:
    0
    Views:
    83
    Mark Heieis
    Jan 11, 2014
  5. Stefan Behnel
    Replies:
    0
    Views:
    65
    Stefan Behnel
    Jan 11, 2014
Loading...

Share This Page