Python-Modul mit einem Bindestrich oder Bindestrich (-) im Namen

92

Ich habe ein vorhandenes Python-Modul mit einem Bindestrich im Namen, foo-bar.py

Das Ändern des Modulnamens würde ich lieber vermeiden, da das Modul gemeinsam genutzt wird, und ich müsste alle Stellen aufspüren, an denen es verwendet wird, damit mein Sonderfall funktioniert.

Gibt es eine Möglichkeit, ein Modul zu laden, dessen Name das normalerweise verbotene '-' enthält?

(Ich verstehe, dass dies keine bewährte Methode ist. In dieser Situation würde ich es jedoch vorziehen, keine viel größeren Anwendungen neu zu entwerfen und zu testen. Außerdem glaube ich nicht, dass meine Unternehmensleiter es gutheißen würden, wenn ich mir die Zeit für die Implementierung nehme eine solche Änderung.)

Überspringen Sie Huffman
quelle
5
Sie können nicht einfach in Ihrer IDE nach Dateien suchen und alle foo-bars durch foobaroder was auch immer ersetzen ? Wie schwer ist das
Agf
2
Diese Antwort insbesondere: stackoverflow.com/questions/761519/…
BenH
agf Kurze Antwort: Es ist nicht alles mein Code.
Überspringen Sie Huffman
S.Lott die anderen Benutzer sind kommerzielle Anwendungen. So weiß ich, dass es möglich ist.
Überspringen Sie Huffman

Antworten:

98

Sie können das mit tun __import__(). Beispielsweise:

foobar = __import__("foo-bar")

Aber Sie sollten das Modul stattdessen wirklich umbenennen. Auf diese Weise können Sie Verwirrung vermeiden, wenn sich der Dateiname des Moduls von der im Programm verwendeten Kennung unterscheidet.

nandhp
quelle
4
Vielen Dank. Ich verstehe, dass Konventionen befolgt werden sollten, wo immer dies praktikabel ist. Ich werde dieses spezielle Problem während einer Überprüfung des Abteilungscodes ansprechen.
Überspringen Sie Huffman
57

Ich weiß, dass diese Frage bereits zur Zufriedenheit des Fragestellers beantwortet wurde, aber hier ist eine andere Antwort, von der ich glaube, dass sie einen gewissen Wert hat __import__().

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

Laut den Dokumenten:

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

NuclearPeon
quelle
5
Ich habe gesucht, wie das geht, und Ihre Antwort trifft besser auf meine Situation zu als die ältere Antwort. Es ist immer gut, wenn Sie eine eindeutige Antwort auf die bereits vorhandene Antwort sehen, um sie als neue Antwort hinzuzufügen, damit Personen in einer Position wie ich alle relevanten Informationen an einem Ort finden können.
Davy M
0

Versuchen Sie, einen Unterstrich anstelle eines Bindestrichs zu verwenden.

importiere pymysql_utils

funktionierte für mich, obwohl import pymysql-utils der Name des von pip verwendeten Moduls war

thetrueankev
quelle