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