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.

¿Fue útil?

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ó.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top