Вы не можете напрямую определить местоположение основного исполняемого скрипта. В конце концов, иногда сценарий вообще не приходит из файла. Например, он может исходить от интерактивного интерпретатора или динамически генерируемого кода, хранящегося только в памяти.
Однако вы можете надежно определить местоположение модуля, так как модули всегда загружаются из файла. Если вы создадите модуль со следующим кодом и поместите его в тот же каталог, что и ваш основной сценарий, то основной сценарий может импортировать модуль и использовать его для определения своего местоположения.
some_path / module_locator.py:
def we_are_frozen():
# All of the modules are built-in to the interpreter, e.g., by py2exe
return hasattr(sys, "frozen")
def module_path():
encoding = sys.getfilesystemencoding()
if we_are_frozen():
return os.path.dirname(unicode(sys.executable, encoding))
return os.path.dirname(unicode(__file__, encoding))
some_path / main.py:
import module_locator
my_path = module_locator.module_path()
Если у вас есть несколько основных сценариев в разных каталогах, вам может потребоваться более одной копии module_locator.
Конечно, если ваш основной сценарий загружается каким-либо другим инструментом, который не позволяет импортировать модули, которые совмещены с вашим сценарием, вам не повезло. В таких случаях информация, которую вы ищете, просто не существует нигде в вашей программе. Лучше всего подать сообщение об ошибке авторам инструмента.