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


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.


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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.