17

I am sorry if it's very basic or already asked before (I googled but couldn't find a simple & satisfactory explanation).

I want to know what sys.stdin.fileno() is?

I saw it in a code and didn't understand what it does. Here's the actual code block,

fileno = sys.stdin.fileno()
if fileno is not None:
    new_stdin = os.fdopen(os.dup(fileno))

I just executed print sys.stdin.fileno() in my python command line and it returned 0.

I also searched google, and this (nullage.com) is the reference I could find, but it also only says,

fileno() -> integer "file descriptor".

This is needed for lower-level file interfaces, such os.read().

So, what exactly does it mean?

Community
  • 1
  • 1
Codebender
  • 14,221
  • 7
  • 48
  • 85
  • That means that it's needed for lower-level file interfaces (such as `os.read`). It's the low level identifier for the file (and it may not be applicable on all platforms), traditionally standard-in has descriptor 0, standard-out 1 and standard-err 2 and other files has descriptors >2. `os.dup` duplicates a descriptor (creates a low-level identifier for a copy of the file), and `fdopen` creates a high-level object from a low-level descriptor. – skyking Aug 25 '15 at 08:57

3 Answers3

25

File descriptor is a low-level concept, it's an integer that represents an open file. Each open file is given a unique file descriptor.

In Unix, by convention, the three file descriptors 0, 1, and 2 represent standard input, standard output, and standard error, respectively.

>>> import sys
>>> sys.stdin.fileno()
0
>>> sys.stdout.fileno()
1
>>> sys.stderr.fileno()
2
Yu Hao
  • 119,891
  • 44
  • 235
  • 294
2

On Unix-like systems when you open a file (or a "file-like" entity) the system uses a file descriptor - an integer - on which you operate.

There are three standard file descriptors - standard input, standard output and standard error - with file descriptors 0, 1, 2 respectively.

The fileno() method returns the file descriptor of a file-like object in python.

scytale
  • 12,346
  • 3
  • 32
  • 46
2

File descriptors are not unique to python. It's part of the POSIX API -- every flavour of UNIX will have them. However, Windows has similar concept of handles that for the most part is synonymous with file descriptors. Thus in python, fileno is used to represent both. They are just an low-level abstract reference to streams of data your program has available to it.

Have a look at the at the wiki page on file descriptors for more.

Dunes
  • 37,291
  • 7
  • 81
  • 97