2011-12-02 22 views
85

Quiero importar foo-bar.py. Esto funciona:Cómo importar el módulo cuando el nombre del módulo tiene un guión '-' o un guión en él?

foobar = __import__("foo-bar") 

Esto no es así:

from "foo-bar" import * 

Mi pregunta: ¿Hay alguna manera de que pueda usar el formato anterior, es decir, from "foo-bar" import * para importar un módulo que tiene una - en ella?

+6

¿Por qué tiene un módulo con una dash en su nombre? –

+11

Supongo que fue escrito originalmente como un script en lugar de como un módulo. –

+0

posible duplicado de [Módulo de Python con un guión, o guión (-) en su nombre] (http://stackoverflow.com/questions/7583652/python-module-with-a-dash-or-hyphen-in-its -name) –

Respuesta

64

no se puede. foo-bar no es un identificador. cambiar el nombre del archivo a foo_bar.py

Editar: Si import no es su objetivo (como en: no le importa lo que sucede con sys.modules, no es necesario que la importación de sí mismo), sólo conseguir todo el archivo de globales en su propio ámbito, puede utilizar execfile

# contents of foo-bar.py 
baz = 'quux' 
>>> execfile('foo-bar.py') 
>>> baz 
'quux' 
>>> 
+2

+1 Esa es la solución más directa. –

+10

Python 3.x [Novedades en Python 3.0] (https://docs.python.org/3/whatsnew/3.0.html) Se ha eliminado execfile(). En lugar de 'execfile (fn)' use 'exec (open (fn) .read())' También está el paquete importlib. – DevPlayer

64

Si no puede cambiar el nombre del módulo de Python para que coincida con las convenciones de nomenclatura, crear un nuevo módulo para actuar como intermediario:

---- foo_proxy.py ---- 
tmp = __import__('foo-bar') 
globals().update(vars(tmp)) 

---- main.py ---- 
from foo_proxy import * 
+13

Nunca implementaría esto. Pero no puedo dar +1 por el gran brillo de este truco – inspectorG4dget

+5

, podrías hacerlo sin el archivo 'foo_proxy.py', asignar la salida de' __import __ (...) 'a' sys.modules [' foo_proxy '] '. En realidad, no hagas eso, es una idea terrible. – SingleNegationElimination

+2

Genial solo lo que estaba buscando. Hay un caso de uso, si uno usa bibliotecas nativas que se envían con una distribución. – Sven

32

Si no puede cambiar el nombre del archivo original, también se puede utilizar un enlace simbólico:

ln -s foo-bar.py foo_bar.py 

a continuación, puedes:

from foo_bar import * 
+0

Es muy hacky, pero al mismo tiempo muy limpio. – user1767754

Cuestiones relacionadas