How can I find the full path to the currently running python script? That is to say, what do I have to put to achieve this:
Nirvana@bahamut:/tmp$ python baz.py
running from /tmp
file is baz.py
How can I find the full path to the currently running python script? That is to say, what do I have to put to achieve this:
Nirvana@bahamut:/tmp$ python baz.py
running from /tmp
file is baz.py
This will print the directory in which the script lives (as opposed to the working directory):
import os
dirname, filename = os.path.split(os.path.abspath(__file__))
print "running from", dirname
print "file is", filename
Here's how it behaves, when I put it in c:\src
:
> cd c:\src
> python so-where.py
running from C:\src
file is so-where.py
> cd c:\
> python src\so-where.py
running from C:\src
file is so-where.py
The script name will (always?) be the first index of sys.argv:
import sys
print sys.argv[0]
EDIT: just found an even easier way to find the path of your running script:
os.path.basename(sys.argv[0]
The running file is always __file__
.
Here's a demo script, named identify.py
print __file__
Here's the results
MacBook-5:Projects slott$ python StackOverflow/identify.py
StackOverflow/identify.py
MacBook-5:Projects slott$ cd StackOverflow/
MacBook-5:StackOverflow slott$ python identify.py
identify.py
__file__
is NOT what you are looking for. Don't use accidental side-effects
sys.argv[0]
is always the path to the script (if in fact a script has been invoked) -- see http://docs.python.org/library/sys.html#sys.argv
__file__
is the path of the currently executing file (script or module). This is accidentally the same as the script if it is accessed from the script! If you want to put useful things like locating resource files relative to the script location into a library, then you must use sys.argv[0].
Example:
C:\junk\so>type \junk\so\scriptpath\script1.py
import sys, os
print "script: sys.argv[0] is", repr(sys.argv[0])
print "script: __file__ is", repr(__file__)
print "script: cwd is", repr(os.getcwd())
import whereutils
whereutils.show_where()
C:\junk\so>type \python26\lib\site-packages\whereutils.py
import sys, os
def show_where():
print "show_where: sys.argv[0] is", repr(sys.argv[0])
print "show_where: __file__ is", repr(__file__)
print "show_where: cwd is", repr(os.getcwd())
C:\junk\so>\python26\python scriptpath\script1.py
script: sys.argv[0] is 'scriptpath\\script1.py'
script: __file__ is 'scriptpath\\script1.py'
script: cwd is 'C:\\junk\\so'
show_where: sys.argv[0] is 'scriptpath\\script1.py'
show_where: __file__ is 'C:\\python26\\lib\\site-packages\\whereutils.pyc'
show_where: cwd is 'C:\\junk\\so'
I would suggest
import os, sys
print os.path.split(os.path.abspath(os.path.realpath(sys.argv[0])))[0]
This way you can safely create symbolic links to the script executable and it will still find the correct directory.