Модуль 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.