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

3 minutos de lectura

¿Como importar un modulo cuando el nombre del modulo tiene
Bala

Quiero importar foo-bar.py. Esto funciona:

foobar = __import__("foo-bar")

Esto no lo hace:

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 un - ¿en eso?

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

    –Matti Virkkunen

    2 dic. 11 a las 2:00

  • Supongo que originalmente se escribió como un script en lugar de como un módulo.

    –Michael Hoffman

    02 dic.

  • posible duplicado del Módulo de Python con un guión o un guión (-) en su nombre

    –Piotr Dobrogost

    26 feb. 14 a las 14:40

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

    –Zelphir Kaltstahl

    11 nov.

  • Posible duplicado de ¿Está bien usar guiones en los archivos de Python al intentar importarlos?

    – maxkoryukov

    17 mayo 2017 en 04:31

A partir de Python 3.1, puede usar importlib:

import importlib  
foobar = importlib.import_module("foo-bar")

( https://docs.python.org/3/library/importlib.html )

  • Creo que esta es la mejor solución, especialmente ahora que Python 2 está obsoleto formalmente

    – usuario5359531

    23 jul.

  • ¿Cómo puedo cambiar el nombre del módulo de esta manera?

    – Ali Khosro

    25 jul.

  • @AliKhosro se llamará independientemente de las variables que establezca. Así que si usas helloworld = importlib.import_module("foo-bar"), luego hará referencia a los campos en foo-bar usando helloworld, p.ej helloworld.abc

    – Christopher Shroba

    26 feb. 21 a las 16:50

¿Como importar un modulo cuando el nombre del modulo tiene
Eliminación de negación simple

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

Editar: Si import no es tu objetivo (como en: no te importa lo que pase con sys.modules, no lo necesita para importarse a sí mismo), simplemente obteniendo todos los globales del archivo en su propio alcance, puede usar execfile

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

  • Pitón 3.x Novedades en Python 3.0 Execfile eliminado (). En vez de execfile(fn) usar exec(open(fn).read()) También existe el paquete importlib.

    – DevPlayer

    08 abr.


  • si no te importa lo que pase con sys.modules“, ¿puedes aclarar lo que quisiste decir? ¿Cuál es la condición para usar execfile?

    – minutos

    18 mayo, 21 en 09:25

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 * 

  • Yo nunca implementaría esto. Pero no puedo dejar de dar +1 por la brillantez de este truco.

    – inspectorG4dget

    02 dic. 11 a las 2:25

  • en realidad podrías hacer esto sin el foo_proxy.py archivo, asigne la salida de __import__(...) a sys.modules['foo_proxy']. En realidad, no hagas eso, es una idea terrible.

    – Eliminación de negación simple

    02 dic. 11 a las 14:03

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

    – Sven

    08 may. 13 en 14:59

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 *

Como otros dijeron que no puede usar el “-” en la denominación de python, hay muchas soluciones, una de esas soluciones que sería útil si tuviera que agregar varios módulos desde una ruta está usando sys.path

Por ejemplo, si su estructura es así:

foo-bar
├── barfoo.py
└── __init__.py

import sys
sys.path.append('foo-bar')

import barfoo

¿Como importar un modulo cuando el nombre del modulo tiene
Hassen cap.

en Python 3.6 tuve el mismo problema”invalid syntax“cuando directamente

import 'jaro-winkler' as jw

dicho “No module named 'jaro-winkler'” cuando usas:

jw = __import__('jaro-winkler')

y importlib.import_module() mismo.

finalmente uso pip para desinstalar el jaro-winkler módulo… solo para tu información

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad