Модуль Python із тире або дефісом (-) у своєму назві


92

У мене є існуючий модуль python із тирею в його назві, foo-bar.py

Зміна назви модуля - це те, чого я волів би уникати, оскільки модуль є спільним, і мені довелося б переслідувати всі місця, де він використовується, щоб мій особливий випадок працював.

Чи є спосіб завантажити модуль, ім'я якого містить типово заборонене "-"?

(Я розумію, що це не найкраща практика. Але в цій ситуації я волів би не переробляти і тестувати набагато більший набір додатків. Також я не думаю, що мої корпоративні майстри схвалюють те, що я витратив час на впровадження така зміна.)


5
Ви не можете просто знайти файли у вашій IDE і замінити всі foo-bars на foobarчи що? Наскільки це важко?
agf


2
Відповідь на це питання , зокрема: stackoverflow.com/questions/761519 / ...
BenH

agf Коротка відповідь: це не весь мій код.
Skip Huffman

S.Lott інші користувачі є комерційними додатками. Звідси я знаю, що це можливо.
Skip Huffman

Відповіді:


98

Ви можете зробити це за допомогою __import__(). Наприклад:

foobar = __import__("foo-bar")

Але замість цього вам слід перейменувати модуль. Таким чином ви можете уникнути плутанини, коли ім'я файлу модуля відрізняється від ідентифікатора, що використовується в програмі.


4
Дякую. Я розумію, що конвенцій слід дотримуватися скрізь, де це можливо. Я підніму це конкретне питання під час перегляду коду відомства.
Skip Huffman

57

Я знаю, що на це запитання вже було дано відповідь із задоволенням запитувача, але ось ще одна відповідь, яка, на мою думку, має певну перевагу вище, ніж використання __import__().

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

Відповідно до документів:

"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 + лише


5
Я шукав, як це зробити, і ваша відповідь більше стосується моєї ситуації, ніж старша відповідь. Завжди добре, якщо ви бачите чітку відповідь на вже існуючу, щоб додати її як нову відповідь, щоб люди в такій позиції, як я, могли знайти всю відповідну інформацію в одному місці.
Davy M

0

Спробуйте використовувати підкреслення замість дефіса.

імпортувати pymysql_utils

працював у мене, хоча імпорт pymysql-utils був назвою модуля, який використовував pip

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.