Módulo Python com um travessão ou hífen (-) no nome

92

Tenho um módulo Python existente com um traço no nome, foo-bar.py

Alterar o nome do módulo é algo que eu preferiria evitar, pois o módulo é compartilhado e eu teria que rastrear todos os locais em que ele é usado para que meu caso especial funcione.

Existe uma maneira de carregar um módulo cujo nome contém o normalmente proibido '-'?

(Eu entendo que esta não é uma prática recomendada. Mas para esta situação, eu preferiria não reprojetar e testar um conjunto muito maior de aplicativos. Além disso, não acho que meus mestres corporativos aprovariam meu tempo para implementar tal mudança.)

Skip Huffman
fonte
5
Você não pode simplesmente localizar arquivos em seu IDE e substituir todos os foo-bars por foobarou algo assim? Quão difícil é isso?
agf
2
Esta resposta em particular: stackoverflow.com/questions/761519/…
BenH
agf Resposta curta: nem tudo é meu código.
Skip Huffman
S.Lott, os outros usuários são aplicativos comerciais. Que é como eu sei que é possível.
Skip Huffman

Respostas:

98

Você pode fazer isso usando __import__(). Por exemplo:

foobar = __import__("foo-bar")

Mas você realmente deve renomear o módulo. Dessa forma, você pode evitar confusão onde o nome do arquivo do módulo é diferente do identificador usado no programa.

nandhp
fonte
4
Obrigado. Eu entendo que as convenções devem ser seguidas sempre que possível. Vou abordar esse problema específico durante uma revisão de código departamental.
Skip Huffman
57

Sei que essa pergunta já foi respondida de forma satisfatória para quem fez a pergunta, mas aqui está outra resposta que acredito ter algum mérito acima de usar __import__().

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

De acordo com a documentação:

"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 + apenas

NuclearPeon
fonte
5
Eu estava procurando como fazer isso e sua resposta se aplica melhor à minha situação do que a resposta anterior. É sempre bom se você vir uma resposta distinta para a já existente para adicioná-la como uma nova resposta para que pessoas em uma posição como eu possam encontrar todas as informações relevantes em um só lugar.
Davy M
0

Tente usar sublinhado em vez de hífen.

importar pymysql_utils

funcionou para mim, embora import pymysql-utils fosse o nome do módulo usado pelo pip

Thetrueankev
fonte