¿Cómo importar el módulo cuando el nombre del módulo tiene un guión o guión '-'?


195

Quiero importar foo-bar.py. Esto funciona:

foobar = __import__("foo-bar")

Esto no lo hace:

from "foo-bar" import *

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


10
¿Por qué tienes un módulo con un guión en su nombre?
Matti Virkkunen

23
Supongo que originalmente se escribió como un script en lugar de como un módulo.
Michael Hoffman


@MattiVirkkunen makepy.py de win32com generará un módulo con un guión. demasiado. comtypes resolvió esto convirtiéndolo en guión bajo
swdev

2
@MattiVirkkunen Creo que Python no debería limitar los nombres que puedo dar a mis directorios. No es su responsabilidad hacerlo.
Zelphir Kaltstahl el

Respuestas:


117

no puedes foo-barNo es un identificador. cambiar el nombre del archivo afoo_bar.py

Editar: si importno es su objetivo (como en: no le importa lo que sucede sys.modules, no necesita que se importe solo), solo puede obtener todos los globales del archivo en su propio alcance, puede usarexecfile

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

24
Python 3.x Novedades en Python 3.0 Eliminado execfile (). En lugar de execfile(fn)uso exec(open(fn).read())También hay un paquete importlib.
DevPlayer

107

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

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

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

30
Nunca implementaría esto. Pero no puedo dejar de dar +1 por la brillantez de este truco
inspectorG4dget

11
realmente podría hacer esto sin el foo_proxy.pyarchivo, asignar la salida de __import__(...)a sys.modules['foo_proxy']. En realidad, no hagas eso, es una idea terrible.
SingleNegationElimination

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


46

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

ln -s foo-bar.py foo_bar.py

Entonces puedes simplemente:

from foo_bar import *

2

Como otro dijo que no puede usar el "-" en la denominación de Python, hay muchas soluciones alternativas, una de ellas sería útil si tuviera que agregar múltiples módulos desde una ruta. sys.path

Por ejemplo, si su estructura es así:

foo-bar
├── barfoo.py
└── __init__.py
import sys
sys.path.append('foo-bar')

import barfoo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.