Difference between __file__ and sys.argv[0]

Question:

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.

Asked By: user225312

||

Answers:

__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.

Answered By: Sven Marnach

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.

Answered By: Achim

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

Answered By: Stanislav Ageev

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.

Answered By: Lumi

You can detect whether your *.py code is running as a module or as the main script!

__file__ is the current file which may be inside a module and not the main script, which is called sys.argv[0].

It’s useful because you can have code, like a main block, tests, etc. in a file that only runs if it’s NOT being used in a module aka it’s the main script

if __file__.endswith(sys.argv[0]):
    #you're the main script
Answered By: chad steele
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.