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

92

Tengo un módulo de Python existente con un guión en su nombre, foo-bar.py

Cambiar el nombre del módulo es algo que preferiría evitar ya que el módulo se comparte, y tendría que buscar todos los lugares donde se usa para que mi caso especial funcione.

¿Hay alguna forma de cargar un módulo cuyo nombre contenga el '-' normalmente prohibido?

(Entiendo que esta no es una práctica recomendada. Pero para esta situación, preferiría no rediseñar y probar un conjunto de aplicaciones mucho más grande. Además, no creo que mis maestros corporativos aprobarían que me tome el tiempo para implementar tal cambio.)

Skip Huffman
fuente
5
¿No puede simplemente hacer una búsqueda en archivos en su IDE y reemplazar todos los foo-barcorreos electrónicos con foobaro lo que sea? ¿Qué tan difícil es eso?
agf
2
Esta respuesta en particular: stackoverflow.com/questions/761519/…
BenH
agf Respuesta corta: no es todo mi código.
Skip Huffman
S.Lott los demás usuarios son aplicaciones comerciales. Por eso sé que es posible.
Skip Huffman

Respuestas:

98

Puedes hacerlo usando __import__(). Por ejemplo:

foobar = __import__("foo-bar")

Pero realmente debería cambiar el nombre del módulo. De esa manera, puede evitar confusiones cuando el nombre de archivo del módulo es diferente del identificador utilizado en el programa.

nandhp
fuente
4
Gracias. Entiendo que las convenciones deben seguirse siempre que sea práctico. Traeré este tema específico durante una revisión del código departamental.
Skip Huffman
57

Sé que esta pregunta ya ha sido respondida a satisfacción del autor de la pregunta, pero aquí hay otra respuesta que creo que tiene algún mérito por encima de su uso __import__().

import importlib
mod = importlib.import_module("path.to.my-module")
# mod.yourmethod()

Según los documentos:

"This provides an implementation of import which is portable to any 
Python interpreter. This also provides an implementation which is 
easier to comprehend than one implemented in a programming language 
other than Python."

Python 2.7 + solo

NuclearPeon
fuente
5
Estaba buscando cómo hacer esto y su respuesta se aplica mejor a mi situación que la respuesta anterior. Siempre es bueno si ves una respuesta distinta a la que ya existe para agregarla como una nueva respuesta para que las personas en una posición como yo puedan encontrar toda la información relevante en un solo lugar.
Davy M
0

Intente utilizar un guión bajo en lugar de un guión.

importar pymysql_utils

funcionó para mí a pesar de que import pymysql-utils era el nombre del módulo utilizado por pip

thetrueankev
fuente