Pathing

Default search path

At startup, the Python module search path checks, in this order, for files in:

1) The home directory of the program

2) PYTHONPATH directories

3) Standard library directories

import sys
sys.path
['',
'C:\\Users\\nhounshell\\Documents\\Projects',
'C:\\Users\\nhounshell\\AppData\\Local\\Continuum\\Anaconda3\\python36.zip',
'C:\\Users\\nhounshell\\AppData\\Local\\Continuum\\Anaconda3\\DLLs',
'C:\\Users\\nhounshell\\AppData\\Local\\Continuum\\Anaconda3\\lib',
'C:\\Users\\nhounshell\\AppData\\Local\\Continuum\\Anaconda3',
'C:\\Users\\nhounshell\\AppData\\Roaming\\Python\\Python36\\site-packages',
'C:\\Users\\nhounshell\\AppData\\Local\\Continuum\\Anaconda3\\lib\\site-packages',
'C:\\Users\\nhounshell\\AppData\\Local\\Continuum\\Anaconda3\\lib\\site-packages\\Babel-2.5.0-py3.6.egg',
'C:\\Users\\nhounshell\\AppData\\Local\\Continuum\\Anaconda3\\lib\\site-packages\\win32',
'C:\\Users\\nhounshell\\AppData\\Local\\Continuum\\Anaconda3\\lib\\site-packages\\win32\\lib',
'C:\\Users\\nhounshell\\AppData\\Local\\Continuum\\Anaconda3\\lib\\site-packages\\Pythonwin',
'C:\\Users\\nhounshell\\AppData\\Local\\Continuum\\Anaconda3\\lib\\site-packages\\IPython\\extensions',
'C:\\Users\\nhounshell\\Documents\\.ipython']


Home directory

If you’re running a top-level file as a program, Home is that file’s directory location.

If you’re working interactively, it’s whatever directory you’re working in.

Modifying the search path

sys.path is just a list. As such, you can append things to it.

For instance, an unrelated, nested directory somewhere else in this repository.

sys.path.append('../File IO/data/secret_unrelated_folder')
import surprise
You're a hacker now.

sys.modules['surprise']
<module 'surprise' from '../File IO/data/secret_unrelated_folder\\surprise.py'>


Relative Pathing Tools

Because Python only knows how to look at Home and a couple other things, as a package’s codebase grows, it can get difficult to keep all of your imports straight.

And you can’t always rely on using the handy, Unix '..' notation to represent relative filepaths.

__file__ and os.getcwd()

These two features can be used to get creative with your pathing.

!type "samplepackage\subdirectory\doublenested.py"
def test_fn():
print("I'm like two levels down.")

import os

getcwdResult = os.getcwd()
fileResult = os.path.dirname(__file__)

from samplepackage.subdirectory.doublenested import getcwdResult, fileResult

os.getcwd() gives you the absolute filepath of where you’re calling Python

getcwdResult
'C:\\Users\\nhounshell\\Documents\\github\\BlackBook\\Python\\Modules and Packages'


Whereas __file__ strictly returns the filepath of that file’s location, regardless of why Python’s looking at it.

fileResult
'C:\\Users\\nhounshell\\Documents\\github\\BlackBook\\Python\\Modules and Packages\\samplepackage\\subdirectory'