Існує проблема з кожною наданою відповіддю, яку можна резюмувати як "просто додайте це магічне заклинання на початок вашого сценарію. Подивіться, що ви можете зробити лише з одним рядком або двома кодами". Вони працюватимуть не у всіх можливих ситуаціях!
Наприклад, один з таких магічних заклинань використовує файл . На жаль, якщо ви пакуєте сценарій за допомогою cx_Freeze або використовуєте IDLE, це призведе до винятку.
Інший такий магічний заклинання використовує os.getcwd (). Це буде працювати лише в тому випадку, якщо ваш сценарій запущений із командного рядка, а каталог, що містить ваш сценарій, є поточним робочим каталогом (тобто ви використовували команду cd для переходу в каталог до запуску сценарію). Е боги! Сподіваюся, мені не доведеться пояснювати, чому це не спрацює, якщо ваш скрипт Python десь знаходиться в PATH, і ви запустили його, просто ввівши ім'я вашого файлу сценарію.
На щастя, існує магічне заклинання, яке спрацює у всіх випробуваних мною випадках. На жаль, магічне заклинання - це більше, ніж просто рядок-два коду.
import inspect
import os
import sys
# Add script directory to sys.path.
# This is complicated due to the fact that __file__ is not always defined.
def GetScriptDirectory():
if hasattr(GetScriptDirectory, "dir"):
return GetScriptDirectory.dir
module_path = ""
try:
# The easy way. Just use __file__.
# Unfortunately, __file__ is not available when cx_freeze is used or in IDLE.
module_path = __file__
except NameError:
if len(sys.argv) > 0 and len(sys.argv[0]) > 0 and os.path.isabs(sys.argv[0]):
module_path = sys.argv[0]
else:
module_path = os.path.abspath(inspect.getfile(GetScriptDirectory))
if not os.path.exists(module_path):
# If cx_freeze is used the value of the module_path variable at this point is in the following format.
# {PathToExeFile}\{NameOfPythonSourceFile}. This makes it necessary to strip off the file name to get the correct
# path.
module_path = os.path.dirname(module_path)
GetScriptDirectory.dir = os.path.dirname(module_path)
return GetScriptDirectory.dir
sys.path.append(os.path.join(GetScriptDirectory(), "lib"))
print(GetScriptDirectory())
print(sys.path)
Як бачите, це непросте завдання!