Anular espacio de nombres en Python
-
11-09-2019 - |
Pregunta
Digamos que hay una carpeta, '/ home / usuario / temp / a40bd22344'. El nombre es completamente al azar y los cambios en cada iteración. Tengo que ser capaz de importar esta carpeta en Python usando un nombre fijo, digamos 'proyecto'. Sé que puedo agregar esta carpeta a sys.path para habilitar la búsqueda de importación, pero ¿hay una forma de reemplazar 'a40bd22344' con 'proyecto'?
Tal vez algunos trucos inteligentes en init .py?
Alta:
Tiene que ser global - es decir, otros scripts que cargan 'proyecto' a través del estándar:
import project
Tiene que funcione correctamente, cargando a40bd22344 lugar.
Solución
primera importación con Importar
>>> __import__('temp/a40bd22344')
<module 'temp/a40bd22344' from 'temp/a40bd22344/__init__.py'>
A continuación, se asegure de que este módulo se conoce a Python como project
:
>>> import sys
>>> sys.modules['project'] = sys.modules.pop('temp/a40bd22344')
Después de esto, nada importación proyecto en la sesión actual de Python obtendrá el módulo original
>>> import project
>>> project
<module 'temp/a40bd22344' from 'temp/a40bd22344/__init__.py'>
Esto funciona también para los sub-módulos: si tiene un foobar.py en el mismo lugar que obtendrá
>>> import project.foobar
>>> project.foobar
<module 'project.foobar' from 'temp/a40bd22344/foobar.py'>
Adición Esto es lo que estoy ejecutando:.
>>> print sys.version
2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)]
Otros consejos
Aquí hay una manera de hacerlo, sin tocar sys.path, utilizando el módulo imp
en Python:
import imp
f, filename, desc = imp.find_module('a40bd22344', ['/home/user/temp/'])
project = imp.load_module('a40bd22344', f, filename, desc)
project.some_func()
Aquí hay un enlace a una buena documentación sobre el módulo de imp
:
Por supuesto, después de project = __import__('a40bd22344')
sys.path
está correctamente solo va a funcionar.
Supongamos que desea hacerlo de una función de tomar la ruta completa como un argumento y establecer el Global importación de project
correctamente (así como mágicamente haciendo el trabajo import project
después en otros módulos). Pedazo de torta:
def weirdimport(fullpath):
global project
import os
import sys
sys.path.append(os.path.dirname(fullpath))
try:
project = __import__(os.path.basename(fullpath))
sys.modules['project'] = project
finally:
del sys.path[-1]
Esto también deja sys.path como lo encontró.