libreria importar clases python python-2.7 import python-import pythonpath

libreria - importar clases en python



Python: cómo acceder al archivo desde un directorio diferente (2)

Si tenía algún módulo en la raíz del árbol del proyecto, diga config_loader.py que se veía así:

import os def get_config_path(): relative_path = ''conf/constants.cfg'' current_dir = os.getcwd() return os.join(current_dir, relative_path)

Y luego en ConfigManager.py o cualquier otro módulo que necesite las configuraciones:

import config_loader file_path = config_loader.get_config_path() config_file = open(file_path)

Incluso podría tener su config_loader.py simplemente devolver el archivo de configuración.

Tengo la siguiente estructura de proyecto

SampleProject com python example source utils ConfigManager.py conf constants.cfg

Cómo acceder a constants.cfg desde ConfigManager.py.

Tengo una limitación

  1. No puedo dar la ruta completa (ruta absoluta) de constants.cfg porque si corro en una PC diferente debería funcionar sin ninguna modificación
  2. Además, si represento algo como a continuación, puedo acceder al archivo. Pero no quiero volver a cortar todo el tiempo

    filename = ..//..//..//..//..//..//constants.cfg`

Actualmente estoy haciendo algo como esto. Pero esto solo funciona cuando constants.cfg y ConfigManager.py están en el mismo directorio

currentDir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) file = open(os.path.join(currentDir,''constants.cfg''))


Si conf es un paquete de Python, puedes usar pkgutil.get_data() :

import pkgutil data = pkgutil.get_data("conf", "constants.cfg")

O si setuptools está instalado - pkg_resources.resource_string() :

import pkg_resources data = pkg_resources.resource_string(''conf'', ''constants.cfg'')

Si constants.cfg no está en un paquete, pase su ruta como un parámetro de línea de comandos, o configúrelo en una variable de entorno, por ejemplo, CONFIG_MANAGER_CONSTANTS_PATH , o lea desde un conjunto fijo de rutas predeterminadas, por ejemplo, os.path.expanduser("~/.config/ConfigManager/constants.cfg") . Para encontrar un lugar donde poner los datos del usuario, puede usar el módulo de aplicaciones .

No puede usar os.getcwd() que devuelve el directorio de trabajo actual si puede ejecutar ConfigManager.py desde diferentes directorios. La ruta relativa "../../..." no funcionará por el mismo motivo.

Si está seguro de que la posición relativa de ConfigManager.py y constants.cfg en el sistema de archivos no cambiará:

import inspect import os import sys def get_my_path(): try: filename = __file__ # where we were when the module was loaded except NameError: # fallback filename = inspect.getsourcefile(get_my_path) return os.path.realpath(filename) # path to ConfigManager.py cm_path = get_my_path() # go 6 directory levels up sp_path = reduce(lambda x, f: f(x), [os.path.dirname]*6, cm_path) constants_path = os.path.join(sp_path, "conf", "constants.cfg")