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
- 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
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")