В одной из моих моделей Django я определил функцию, которая загружает внешнюю библиотеку * .dll, перейдя в каталог и затем импортировав библиотеку с помощью ctypes.CDLL
... так что в принципе это то, что я делаю в функции модели:
basepath = os.getcwd()
_DIRNAME = os.path.dirname(__file__)
dllspath = os.path.join(_DIRNAME, "dlls_x64")
os.chdir(dllspath)
__libx64 = ctypes.CDLL("libx64")
...
os.chdir(basepath)
Я уверен, что изменение каталогов не рекомендуется во время вызова функции, и это плохой дизайн, но сейчас я просто хочу понять, что
ctypes.CDLL
точно делает.
Потому что, когда я тестирую эту функцию в модульном тесте, библиотека может быть найдена, и ошибка не возникает.
Но когда я тестирую код в интерактивном режиме в консоли Python, модуль не может быть найден:
OSError: [WinError 126] The specified module could not be found
Я запускаю свои модульные тесты с модулем django-test-without-migrations
и бэкэндом sqlite, потому что я не могу создать базу данных юнит-тестов для своей производственной базы данных Oracle. Поэтому для юнит-тестов я делаю:
python manage.py test --nomigrations --settings=settings.unittests
и settings.unittests.py содержит:
from settings.defaults import *
DATABASES['default'] = {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db_unittests.sqlite3')
}
в то время как для интерактивной консоли Python, я иду:
python manage.py shell_plus
Поэтому я не понимаю, почему импорт * .dll работает в модульном тесте для функции, а не при вызове функции в консоли.