__file__ is the path name of the file from which the module was loaded, if it was loaded from a file. The __file__ attribute is not present for C modules that are statically linked into the interpreter; for extension modules loaded dynamically from a shared library, it is the path name of the shared library file.This means you can't always rely on os.path.dirname(__file__) to find the folder of where your python file is located. Here is a function that has four potential checks to get the python file's folder location:
import os def getPythonFileLocation(): """ returns the location of where the python file is located """ if os.path.dirname(__file__) != "": return os.path.dirname(__file__) elif os.path.dirname(os.path.abspath(__file__)) != "": return os.path.dirname(os.path.abspath(__file__)) elif os.path.dirname(os.getcwd()) != "": return os.path.dirname(os.getcwd()) else: from inspect import getsourcefile return os.path.dirname(os.path.abspath(getsourcefile(lambda _:None)))The function first tries the __file__ property using the os.path.dirname() then it tries another flavor of __file__ that I found from good old stack exchange. The 3rd check uses the os.getcwd() and finally it falls back on the inspect library.
Hopefully this will help prevent 'NoneType' issues when trying to join string paths.