Импортировать библиотеку, которая в разных системах имеет разное имя модуля
Нужно написать программу на Python, которая должна работать как на Windows, так и на Linux. Но библиотека pycrypto в Windows устанавливается как Crypto
, а в Kali Linux – как Cryptodome
. Как сделать так, чтобы мой код запускался без каких-либо изменений как в Windows, так и в Linux?
Пробовал сделать так:
try:
import Crypto
except ModuleNotFoundError:
import Cryptodome as Crypto
Но с такой реализацией возникает проблема импорта подмодулей, например, Crypto.Cipher
, Crypto.Hash
и др., то есть для каждого придётся писать отдельный try-except блок, но такая конструкция в самом начале файла даже смотрится не очень. Есть ли какой-то более "красивый" способ это сделать?
Ответы (2 шт):
В качестве идеи (нет возможности лично проверять):
import os
if os.name == "nt": import Crypto
else: import Cryptodome as Crypto
Тут налицо путаница в пакетах.
Изначально модуль Crypto
устанавливался пакетом pycrypto
. Но этот пакет был написан кривовато, содержал ошибки и уязвимости, последний релиз был в 2013, и три года назад его окончательно забросили.
Однако он создал в мире Пайтона общеупотребимые интерфейсы, и группа товарищей десять лет назад запустила проект по тотальной переделке pycrypto
. Проект назвали pycryptodome
. Он проектировался как замена для pycrypto
и поэтому устанавливал код в тот же модуль Crypto
. Но! для разных целей - типа совместного использования pycrypto
и pycryptodome
, есть пакет pycryptodomex
, который устанавливает тот же самый код что и pycryptodome
, но в модуль Cryptodome
.
Если вам интересно моё мнение, я всегда устанавливаю pycryptodomex
и работаю с Cryptodome
. Так как я застал те времена, когда в ходу были и pycrypto
, и pycryptodome
, то дабы не путаться в том, что именно у меня установлено, я привык ставить старый код в Crypto
, а новый в Cryptodome
.
Если вы и в Windows, и в Linux установите пакет pycryptodomex
, то у вас в обеих системах будут модули с именем Cryptodome
, и не потребуется огород городить.