Module Python avec un tiret ou un trait d'union (-) dans son nom

92

J'ai un module python existant avec un tiret dans son nom, foo-bar.py

Changer le nom du module est quelque chose que je préférerais éviter car le module est partagé, et je devrais rechercher tous les endroits où il est utilisé pour que mon cas particulier fonctionne.

Existe-t-il un moyen de charger un module dont le nom contient le «-» généralement interdit?

(Je comprends que ce n'est pas une bonne pratique. Mais dans ce cas, je préférerais ne pas repenser et tester un ensemble d'applications beaucoup plus volumineux. De plus, je ne pense pas que mes responsables d'entreprise approuveraient que je prenne le temps de mettre en œuvre un tel changement.)

Sauter Huffman
la source
5
Vous ne pouvez pas simplement faire une recherche dans les fichiers dans votre IDE et remplacer tous les foo-bars par foobarou quoi que ce soit? Est-ce difficile?
agf le
2
Cette réponse en particulier: stackoverflow.com/questions/761519/…
BenH
agf Réponse courte: ce n'est pas tout mon code.
Skip Huffman
S.Lott les autres utilisateurs sont des applications commerciales. C'est ainsi que je sais que c'est possible.
Skip Huffman

Réponses:

98

Vous pouvez le faire en utilisant __import__(). Par exemple:

foobar = __import__("foo-bar")

Mais vous devriez vraiment renommer le module à la place. De cette façon, vous pouvez éviter toute confusion lorsque le nom de fichier du module est différent de l'identifiant utilisé dans le programme.

nandhp
la source
4
Merci. Je comprends que les conventions doivent être suivies dans la mesure du possible. J'aborderai cette question particulière lors d'un examen du code ministériel.
Skip Huffman
57

Je sais que cette question a déjà reçu une réponse à la satisfaction du demandeur, mais voici une autre réponse qui, selon moi, a un certain mérite d'être utilisée __import__().

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

Selon la documentation:

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

NucléairePeon
la source
5
Je cherchais comment faire cela et votre réponse s'applique mieux à ma situation que l'ancienne réponse. C'est toujours bien si vous voyez une réponse distincte à la réponse déjà existante pour l'ajouter en tant que nouvelle réponse afin que les personnes dans une position comme moi puissent trouver toutes les informations pertinentes en un seul endroit.
Davy M
0

Essayez d'utiliser un trait de soulignement au lieu d'un trait d'union.

importer pymysql_utils

a fonctionné pour moi même si import pymysql-utils était le nom du module utilisé par pip

thetrueankev
la source