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

Bala
fuente
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
1
posible duplicado del Módulo Python con un guión o guión (-) en su nombre
Piotr Dobrogost
@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'
>>> 
SingleNegationElimination
fuente
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 * 
Raymond Hettinger
fuente
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 *
gitaarik
fuente
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
Reda Drissi
fuente