Hay un problema con cada respuesta proporcionada que se puede resumir como "simplemente agregue este encantamiento mágico al principio de su script. Vea lo que puede hacer con solo una línea o dos de código". ¡No funcionarán en todas las situaciones posibles!
Por ejemplo, uno de esos encantamientos mágicos usa file . Desafortunadamente, si empaqueta su script usando cx_Freeze o está usando IDLE, esto resultará en una excepción.
Otro encantamiento mágico de este tipo usa os.getcwd (). Esto solo funcionará si está ejecutando su script desde el símbolo del sistema y el directorio que contiene su script es el directorio de trabajo actual (es decir, usó el comando cd para cambiar al directorio antes de ejecutar el script). ¡Eh, dioses! Espero no tener que explicar por qué esto no funcionará si su script de Python está en la RUTA en algún lugar y lo ejecutó simplemente escribiendo el nombre de su archivo de script.
Afortunadamente, hay un encantamiento mágico que funcionará en todos los casos que he probado. Desafortunadamente, el encantamiento mágico es más que una o dos líneas de código.
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)
Como puede ver, ¡no es una tarea fácil!