alvas alvas - 3 days ago 4
Python Question

What does os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)) mean? python

In several SO's question there is these lines to access the parent directory of the code, e.g. os.path.join(os.path.dirname(__file__)) returns nothing and os.path.join(os.path.dirname(__file__)) returns nothing

import os, sys
parentddir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))
sys.path.append(parentddir)


I understand that
os.path.abspath()
returns absolute path of something and
sys.path.append()
adds the path for the code to access. but what is this cryptic line below, what does it really mean?

os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))


Is there another way to achieve the same purpose of appending the parent directory of the where the code?

This problem happens because I am calling functions across directories and sometimes they share the same file name, e.g.
script1/utils.py
and
script2/utils.py
. I am calling a function from
script1/test.py
which calls
script2/something.py
contains a function that calls
script2/utils.py
and the following code

script1/
utils.py
src/
test.py

script2/
utils.py
code/
something.py


test.py

from script2.code import something
import sys
sys.path.append('../')
import utils

something.foobar()


something.py

import os, sys
parentddir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))
sys.path.append(parentddir)
import utils

def foobar():
utils.somefunc()

Answer

That is a clever way to refer to paths regardless of the script location. The cryptic line you're referring is:

os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))

There are 3 methods and a 2 constants present:

  1. abspath returns absolute path of a path
  2. join join to path strings
  3. dirname returns the directory of a file
  4. __file__ refers to the script's file name
  5. pardir returns the representation of a parent directory in the OS (usually ..)

Thus, the expression returns the full path name of the executing script in a multiplatform-safe way. No need to hardwire any directions, that's why it is so useful.

There might be other approaches to get a parent directory of where a file is located, for example, programs have the concept of current working directory, os.getcwd(). So doing os.getcwd()+'/..' might work. But this is very dangerous, because working directories can be changed.

Also, if the file is intended to be imported, the working directory will point to the importing file, not the importee, but __file__ always points to the actual module's file so it is safer.

Hope this helps!

Comments