Bienvenido a nuestra página web, en este lugar hallarás la respuesta que estabas buscando.
Solución:
No puede determinar directamente la ubicación del script principal que se está ejecutando. Después de todo, a veces la secuencia de comandos no procedía de ningún archivo. Por ejemplo, podría provenir del intérprete interactivo o del código generado dinámicamente almacenado solo en la memoria.
Sin embargo, puede determinar de forma fiable la ubicación de un módulo, ya que los módulos siempre se cargan desde un archivo. Si crea un módulo con el siguiente código y lo coloca en el mismo directorio que su script principal, entonces el script principal puede importar el módulo y usarlo para ubicarse.
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))
alguna_ruta/principal.py:
import module_locator
my_path = module_locator.module_path()
Si tiene varios scripts principales en diferentes directorios, es posible que necesite más de una copia de module_locator.
Por supuesto, si su secuencia de comandos principal está cargada por alguna otra herramienta que no le permite importar módulos que se ubican junto con su secuencia de comandos, entonces no tendrá suerte. En casos como ese, la información que busca simplemente no existe en ninguna parte de su programa. Su mejor apuesta sería informar un error a los autores de la herramienta.
Primero, necesita importar desde inspect
y os
from inspect import getsourcefile
from os.path import abspath
A continuación, donde quiera que desee encontrar el archivo fuente, simplemente use
abspath(getsourcefile(lambda:0))
esta solución es robusta incluso en ejecutables
import inspect, os.path
filename = inspect.getframeinfo(inspect.currentframe()).filename
path = os.path.dirname(os.path.abspath(filename))
Tienes la opción de añadir valor a nuestro contenido colaborando tu veteranía en las aclaraciones.