30
votes

Is there any difference between:

__file__

and

sys.argv[0]

Because both seem to be doing the same thing: they hold the name of the script.

If there is no difference, then why is it that __file__ is used in almost all someplaces whereas I have never seen sys.argv[0] being used.

4

4 Answers

26
votes

__file__ is the name of the current file, which may be different from the main script if you are inside a module or if you start a script using execfile() rather than by invoking python scriptname.py. __file__ is generally your safer bet.

7
votes

It's only the same if you are in the "main" script of your python programm. If you import other files, __file__ will contain the path to that file, but sys.argv will still hold the same values.

3
votes

It's like Sven said.

MiLu@Dago: /tmp > cat file.py
import sys
import blub
print __file__
print sys.argv[0]

MiLu@Dago: /tmp > cat blub.py
import sys
print "BLUB: " + __file__
print "BLUB: " + sys.argv[0]

MiLu@Dago: /tmp > python file.py
BLUB: /tmp/blub.pyc
BLUB: file.py
file.py
file.py

I thought that __file__ was replaced with the filename during a preprocessor step. I was not 100 % sure that's actually the case in Python - but it is in C/C++ and Perl. In Python, this might be different as the __file__ is also correct for compiled Python files (pyc), and there doesn't seem to be any trace of the filename in that file's contents.

0
votes

Actually argv[0] might be a script name or a full path to the script + script name, depending on the os.

Here's the entry in official documentation http://docs.python.org/py3k/library/sys.html#sys.argv