Существует проблема с каждым предоставленным ответом, который можно обобщить как «просто добавьте это волшебное заклинание в начало вашего сценария. Посмотрите, что вы можете сделать, используя всего лишь одну или две строки кода». Они не будут работать во всех возможных ситуациях!
Например, одно из таких магических заклинаний использует file .К сожалению, если вы упакуете свой скрипт с помощью 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)
Как видите, это нелегкая задача!