Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get location of the .py source file

Tags:

python

Say I have a python file in directory e like this:

/a/b/c/d/e/file.py

Under directory e I have a few folders I want to access but if file.py is executed from anywhere else rather than from folder e the relative path won't work for me. Also folder e could be located anywhere but always with the a set of sub folders so absolute path will not work.

First, is there any function to get the absolute path in relation to the source files location?

If not, any ideas how to sort this out? Grab the command line used and add the CWD together?

My problem here is that this folder are being installed on 20 different machines and OS's and I want it to be as dynamic as possible with little configurations and "rules" where it has to be installed etc.

like image 424
StefanE Avatar asked Aug 23 '11 14:08

StefanE


People also ask

How do I find the location of a Python file?

To retrieve a file in Python, you need to know the exact path to reach the file, in Windows, you can view a particular file's path by right-clicking the File-> Properties-> General-> Location. Similarly, to run a script, the working directory needs to be set to the directory containing the script.

How do I get the full path of a file in Python?

To get current file's full path, you can use the os. path. abspath function. If you want only the directory path, you can call os.


3 Answers

# in /a/b/c/d/e/file.py
import os
os.path.dirname(os.path.abspath(__file__)) # /a/b/c/d/e
like image 82
Emil Ivanov Avatar answered Oct 20 '22 17:10

Emil Ivanov


In Python +3.4 use of pathlib is more handy:

from pathlib import Path

source_path = Path(__file__).resolve()
source_dir = source_path.parent
like image 41
Marek R Avatar answered Oct 20 '22 19:10

Marek R


Here is my solution which (a) gets the .py file rather than the .pyc file, and (b) sorts out symlinks.

Working on Linux, the .py files are often symlinked to another place, and the .pyc files are generated in the directory next to the symlinked py files. To find the real path of the source file, here's part of a script that I use to find the source path.

try:
    modpath = module.__file__
except AttributeError:
    sys.exit('Module does not have __file__ defined.')
    # It's a script for me, you probably won't want to wrap it in try..except

# Turn pyc files into py files if we can
if modpath.endswith('.pyc') and os.path.exists(modpath[:-1]):
    modpath = modpath[:-1]

# Sort out symlinks
modpath = os.path.realpath(modpath)
like image 22
Chris Morgan Avatar answered Oct 20 '22 17:10

Chris Morgan