Reputation: 131697
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.
Upvotes: 34
Views: 6652
Reputation: 978
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
Upvotes: 0
Reputation: 15284
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.
Upvotes: 3
Reputation: 15712
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.
Upvotes: 7
Reputation: 778
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
Upvotes: 0
Reputation: 601909
__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.
Upvotes: 27