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

92

У меня есть существующий модуль python с тире в его имени, foo-bar.py

Я бы предпочел избежать изменения имени модуля, поскольку модуль является общим, и мне пришлось бы искать все места, где он используется, чтобы мой особый случай работал.

Есть ли способ загрузить модуль, имя которого содержит обычно запрещенный знак '-'?

(Я понимаю, что это не лучшая практика. Но в этой ситуации я бы предпочел не перепроектировать и не тестировать гораздо больший набор приложений. Кроме того, я не думаю, что мои корпоративные мастера одобрили бы мое время на внедрение такое изменение.)

Пропустить Хаффман
источник
5
Вы не можете просто выполнить поиск файлов в своей среде IDE и заменить все foo-bars на foobarчто-то еще? Насколько это сложно?
agf
2
В частности, этот ответ: stackoverflow.com/questions/761519/…
BenH
agf Краткий ответ: это не весь мой код.
Скип Хаффман,
S.Lott у остальных пользователей коммерческие приложения. Вот откуда я знаю, что это возможно.
Скип Хаффман

Ответы:

98

Вы можете сделать это с помощью __import__(). Например:

foobar = __import__("foo-bar")

Но вместо этого вам действительно следует переименовать модуль. Таким образом можно избежать путаницы, когда имя файла модуля отличается от идентификатора, используемого в программе.

нандхп
источник
4
Спасибо. Я понимаю, что условности следует соблюдать везде, где это возможно. Я подниму этот конкретный вопрос во время проверки кода отдела.
Скип Хаффман
58

Я знаю, что на этот вопрос уже был дан ответ, удовлетворительно задающий вопрос, но вот еще один ответ, который, как я считаю, имеет некоторые достоинства, использованные выше __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
1

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

импортировать pymysql_utils

работал у меня, хотя import pymysql-utils был именем модуля, используемого pip

Thetrueankev
источник