Загрузка * .dll через ctypes работает в модульном тесте django, но в противном случае происходит сбой - PullRequest
0 голосов
/ 25 марта 2019

В одной из моих моделей 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 работает в модульном тесте для функции, а не при вызове функции в консоли.

...