how to get script name when using execfile() in IPython to run script

I have scripts calling other script files but I need to get the filepath of the file that is currently running within the process.

For example, let's say I have three files. Using execfile:

  • calls
  • In turn, calls

How can I get the file name and path of, from code within, without having to pass that information as arguments from

(Executing os.getcwd() returns the original starting script's filepath not the current file's.)



import inspect, os
print inspect.getfile(inspect.currentframe()) # script filename (usually with path)
print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # script directory


as others have said. You may want to use:


The suggestions marked as best are all true if your script consists of only one file.

If you want to find out the name of the executable (i.e. the root file passed to the python interpreter for the current program) from a file that may be imported as a module, you need to do this (let's assume this is in a file named

import inspect

print inspect.stack()[-1][1]

Because the last thing ([-1]) on the stack is the first thing that went into it (stacks are LIFO/FILO data structures).

Then in file if you import foo it'll print, rather than, which would be the value of all of these:

  • __file__
  • inspect.getfile(inspect.currentframe())
  • inspect.stack()[0][1]

I think this is cleaner:

import inspect
print inspect.stack()[0][1]

and gets the same information as:

print inspect.getfile(inspect.currentframe())

Where [0] is the current frame in the stack (top of stack) and [1] is for the file name, increase to go backwards in the stack i.e.

print inspect.stack()[1][1]

would be the file name of the script that called the current frame. Also, using [-1] will get you to the bottom of the stack, the original calling script.

import os
print os.path.basename(__file__)

this will give us the filename only. i.e. if abspath of file is c:\abcd\ then 2nd line will print

It's not entirely clear what you mean by "the filepath of the file that is currently running within the process". sys.argv[0] usually contains the location of the script that was invoked by the Python interpreter. Check the sys documentation for more details.

As @Tim and @Pat Notz have pointed out, the __file__ attribute provides access to

the file from which the module was loaded, if it was loaded from a file

import os
os.path.dirname(__file__) # relative directory path
os.path.abspath(__file__) # absolute file path
os.path.basename(__file__) # the file name only

Here is an experiment based on the answers in this thread - with Python 2.7.10 on Windows.

The stack-based ones are the only ones that seem to give reliable results. The last two have the shortest syntax, ie -

print os.path.abspath(inspect.stack()[0][1])                   # C:\testpath\lib\
print os.path.dirname(os.path.abspath(inspect.stack()[0][1]))  # C:\testpath\lib

Here's to these being added to sys as functions! Credit to @Usagi and @pablog

Based on the following three files, and running from its folder with python (also tried execfiles with absolute paths and calling from a separate folder).

C:\testpath\ execfile('')
C:\testpath\ execfile('lib/')

import sys
import os
import inspect

print "Python " + sys.version

print __file__                                        #
print sys.argv[0]                                     #
print inspect.stack()[0][1]                           # lib/
print sys.path[0]                                     # C:\testpath

print os.path.realpath(__file__)                      # C:\testpath\
print os.path.abspath(__file__)                       # C:\testpath\
print os.path.basename(__file__)                      #
print os.path.basename(os.path.realpath(sys.argv[0])) #

print sys.path[0]                                     # C:\testpath
print os.path.abspath(os.path.split(sys.argv[0])[0])  # C:\testpath
print os.path.dirname(os.path.abspath(__file__))      # C:\testpath
print os.path.dirname(os.path.realpath(sys.argv[0]))  # C:\testpath
print os.path.dirname(__file__)                       # (empty string)

print inspect.getfile(inspect.currentframe())         # lib/

print os.path.abspath(inspect.getfile(inspect.currentframe())) # C:\testpath\lib\
print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # C:\testpath\lib

print os.path.abspath(inspect.stack()[0][1])          # C:\testpath\lib\
print os.path.dirname(os.path.abspath(inspect.stack()[0][1]))  # C:\testpath\lib

The __file__ attribute works for both the file containing the main execution code as well as imported modules.


import sys

print sys.path[0]

this would print the path of the currently executing script

import sys
print sys.argv[0]

I think it's just __file__ Sounds like you may also want to checkout the inspect module.

I have a script that must work under windows environment. This code snipped is what I've finished with:

import os,sys
PROJECT_PATH = os.path.abspath(os.path.split(sys.argv[0])[0])

it's quite a hacky decision. But it requires no external libraries and it's the most important thing in my case.

You can use inspect.stack()

import inspect,os
inspect.stack()[0]  => (<frame object at 0x00AC2AC0>, 'g:\\Python\\Test\\', 15, '<module>', ['print inspect.stack()[0]\n'], 0)
os.path.abspath (inspect.stack()[0][1]) => 'g:\\Python\\Test\\'

import os

No need for inspect or any other library.

This worked for me when I had to import a script (from a different directory then the executed script), that used a configuration file residing in the same folder as the imported script.

This should work:

import os,sys

import os

import wx

# return the full path of this file

icon = wx.Icon(os.getcwd() + '/img/image.png', wx.BITMAP_TYPE_PNG, 16, 16)

# put the icon on the frame

I used the approach with __file__
but there is a little trick, it returns the .py file when the code is run the first time, next runs give the name of *.pyc file
so I stayed with:

if you want just the filename without ./ or .py you can try this

filename =
file_name = __file__[2:-3]

file_name will print testscript you can generate whatever you want by changing the index inside []

Category: python Time: 2008-09-08 Views: 3

Related post

iOS development

Android development

Python development

JAVA development

Development language

PHP development

Ruby development


Front-end development


development tools

Open Platform

Javascript development

.NET development

cloud computing


Copyright (C), All Rights Reserved.

processed in 0.210 (s). 12 q(s)