Moduł Pythona z myślnikiem lub łącznikiem (-) w nazwie

92

Mam istniejący moduł Pythona z myślnikiem w nazwie, foo-bar.py

Zmiana nazwy modułu jest czymś, czego wolałbym uniknąć, ponieważ moduł jest udostępniany, i musiałbym ścigać wszystkie miejsca, w których jest używany, aby mój specjalny przypadek zadziałał.

Czy istnieje sposób, aby załadować moduł, którego nazwa zawiera zwykle zabronione „-”?

(Rozumiem, że to nie jest najlepsza praktyka. Ale w tej sytuacji wolałbym nie przeprojektowywać i testować znacznie większego zestawu aplikacji. Nie sądzę też, aby moi mistrzowie korporacji pochwalili mój czas na wdrożenie taka zmiana.)

Pomiń Huffmana
źródło
5
Nie można po prostu zrobić plików Znajdź na w swoim IDE i zastąpić wszystkie foo-barsz foobarlub cokolwiek? Czy to jest trudne?
agf
2
W szczególności ta odpowiedź: stackoverflow.com/questions/761519/ ...
BenH,
agf Krótka odpowiedź: to nie jest cały mój kod.
Skip Huffman
S.Lott pozostali użytkownicy to aplikacje komercyjne. Stąd wiem, że jest to możliwe.
Skip Huffman

Odpowiedzi:

99

Możesz to zrobić za pomocą __import__(). Na przykład:

foobar = __import__("foo-bar")

Ale naprawdę powinieneś zmienić nazwę modułu. W ten sposób można uniknąć nieporozumień, gdy nazwa pliku modułu różni się od identyfikatora używanego w programie.

nandhp
źródło
4
Dzięki. Rozumiem, że wszędzie tam, gdzie jest to praktyczne, należy przestrzegać konwencji. Poruszę ten konkretny problem podczas przeglądu kodu departamentu.
Skip Huffman
58

Wiem, że odpowiedź na to pytanie była już satysfakcjonująca dla pytającego, ale tutaj jest inna odpowiedź, która moim zdaniem ma pewną zaletę powyżej użycia __import__().

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

Według dokumentów:

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

NuclearPeon
źródło
5
Szukałem, jak to zrobić, a twoja odpowiedź lepiej pasuje do mojej sytuacji niż starsza odpowiedź. Zawsze dobrze jest, jeśli zobaczysz wyraźną odpowiedź na już istniejącą, aby dodać ją jako nową odpowiedź, aby osoby na takim stanowisku jak ja mogły znaleźć wszystkie istotne informacje w jednym miejscu.
Davy M
0

Spróbuj użyć podkreślenia zamiast łącznika.

import pymysql_utils

zadziałało dla mnie, mimo że import pymysql-utils to nazwa modułu używanego przez pip

thetrueankev
źródło