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 surpriseYou'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, fileResultos.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'