tutorial operator modules from __all__ python python-module

operator - ¿Cómo obtener el nombre de archivo del módulo__main__ en Python?



python tutorial (5)

El código de Python a continuación proporciona una funcionalidad adicional, incluido el hecho de que funciona perfectamente con los ejecutables de py2exe .

Utilizo un código similar que me gusta para encontrar rutas relacionadas con el script en ejecución, también __main__ como __main__ . Como beneficio adicional, funciona multiplataforma, incluido Windows.

import imp import os import sys def main_is_frozen(): return (hasattr(sys, "frozen") or # new py2exe hasattr(sys, "importers") # old py2exe or imp.is_frozen("__main__")) # tools/freeze def get_main_dir(): if main_is_frozen(): # print ''Running from path'', os.path.dirname(sys.executable) return os.path.dirname(sys.executable) return os.path.dirname(sys.argv[0]) # find path to where we are running path_to_script=get_main_dir() # OPTIONAL: # add the sibling ''lib'' dir to our module search path lib_path = os.path.join(get_main_dir(), os.path.pardir, ''lib'') sys.path.insert(0, lib_path) # OPTIONAL: # use info to find relative data files in ''data'' subdir datafile1 = os.path.join(get_main_dir(), ''data'', ''file1'')

Es de esperar que el código de ejemplo anterior pueda proporcionar información adicional sobre cómo determinar la ruta al script en ejecución ...

Supongamos que tengo dos módulos:

a.py:

import b print __name__, __file__

b.py:

print __name__, __file__

Ejecuto el archivo "a.py". Esto imprime:

b C:/path/to/code/b.py __main__ C:/path/to/code/a.py

Pregunta : ¿Cómo __main__ la ruta al módulo __main__ ("a.py" en este caso) desde la biblioteca "b.py"?


Otro método sería utilizar sys.argv[0] .

import os import sys main_file = os.path.realpath(sys.argv[0]) if sys.argv[0] else None

sys.argv[0] será una cadena vacía si Python se inicia con -c o si se marca desde la consola de Python.


Tal vez esto hará el truco:

import sys from os import path print path.abspath(sys.modules[''__main__''].__file__)

Tenga en cuenta que, por seguridad, debe verificar si el módulo __main__ tiene un atributo __file__ . Si se crea dinámicamente, o simplemente se ejecuta en la consola interactiva de Python, no tendrá un __file__ :

python >>> import sys >>> print sys.modules[''__main__''] <module ''__main__'' (built-in)> >>> print sys.modules[''__main__''].__file__ AttributeError: ''module'' object has no attribute ''__file__''

Una simple comprobación de hasattr () hará el truco para protegerse contra el escenario 2 si esa es una posibilidad en su aplicación.


import __main__ print __main__.__file__


import sys, os def getExecPath(): try: sFile = os.path.abspath(sys.modules[''__main__''].__file__) except: sFile = sys.executable return os.path.dirname(sFile)

Esta función funcionará para los programas compilados de Python y Cython.