Произошел сбой в программе инициализации библиотеки динамической компоновки dll python
I installed TensorFlow with CPU support with CUDA Toolkit v9.0 and cuDNNv7.1 and Python 3.6 in Conda enviroment.
I followed the instructions described in TensorFlow website, and when I tried:
I got this error:
Did I miss something?
7 Answers 7
I have found solution for this it might be that your cpu doesnt support AVX so I install tensorflow from this custommade repository found on github link is here
I selected 1.12.0 for py 37 in that folder select py36 folder and cpu folder and download the file within sse2
cpu which doesn support download sse2 whl
Please don't just provide a link as an asnwer. Use them to backup your solution, not as the actual solution.
you get the problem when used pip not conda
the best answer is (it's work 100%):
type following command: if already install TensorFlow you should reinstall it by the following command:
if not, install it by the following command :
I get this solution from this link below :
thank's @sdmars Tamiris Crepalde she is helping me to get the solution:
Here is a simple solution (no conda, no gpu/cpu staff)
Uninstall any version of tensorflow you have already installed.
install tensorflow 1.15
then try import tensorflow
It says "Could not find a version that satisfies the requirement" and provides a series going from 1.13.1 to 2.3.0rc0.
I had a similar problem. I knew that my CPU (Pentium G4560) does not support AVX, so I changed tensorflow version from 1.6 to 1.5. There is a link for the manual:
I had a similar issue. I have a computer with an Intel Celeron J3455 and I discovered thath my CPU doesn't support AVX, so I can't use official binaries from TensorFlow 1.6 included.
In my case, I choosed Tensorflow 1.15 for Python 3.7 ( py37 ): tensorflow-1.15.0-cp37-cp37m-win_amd64.whl . If you want another version, download an avaliable sse2 version.
Недавно меня заинтересовала тема использования DLL из Python. Кроме того было интересно разобраться в их структуре, на тот случай, если придется менять исходники библиотек. После изучения различных ресурсов и примеров на эту тему, стало понятно, что применение динамических библиотек может сильно расширить возможности Python. Собственные цели были достигнуты, а чтобы опыт не был забыт, я решил подвести итог в виде статьи — структурировать свой знания и полезные источники, а заодно ещё лучше разобраться в данной теме.
Под катом вас ожидает статья с различными примерами, исходниками и пояснениями к ним.
Содержание
- Структура DLL
- DLL & Python
- Подключение DLL
- Типы данных в С и Python
- Аргументы функция и возвращаемые значения
- Своя DLL и ее использование
Надеюсь из содержания немного станет понятнее какую часть нужно открыть, чтобы найти ответы на свои вопросы.
Структура DLL
DLL — Dynamic Link Library — динамическая подключаемая библиотека в операционной системе (ОС) Windows. Динамические библиотеки позволяют сделать архитектуру более модульной, уменьшить количество используемых ресурсов и упрощают модификацию системы. Основное отличие от .EXE файлов — функции, содержащиеся в DLL можно использовать по одной.
Учитывая, что статья не о самих библиотеках, лучше просто оставить здесь ссылку на довольно информативную статью от Microsoft: Что такое DLL?.
Для того, чтобы понять, как использовать динамические библиотеки, нужно вникнуть в их структуру.
DLL содержит набор различных функций, которые потом можно использовать по-отдельности. Но также есть возможность дополнительно указать функцию точки входа в библиотеку. Такая функция обычно имеет имя DllMain и вызывается, когда процессы или потоки прикрепляются к DLL или отделяются от неё. Это можно использовать для инициализации различных структур данных или их уничтожения.
Рисунок 1 — Пустой template, предлагаемый Code Blocks для проекта DLL.
На рисунке 1 приведен шаблон, который предлагает Code Blocks, при выборе проекта типа DLL. В представленном шаблоне есть две функции:
Для начала стоит подробнее рассмотреть функцию DllMain . Через нее ОС может уведомлять библиотеку о нескольких событиях (fdwReason):
DLL_PROCESS_ATTACH – подключение DLL. Процесс проецирования DLL на адресное пространство процесса. С этим значением DllMain вызывается всякий раз, когда какой-то процесс загружает библиотеку с явной или неявной компоновкой.
DLL_PROCESS_DETACH – отключение DLL от адресного пространства процесса. С этим значением DllMain вызывается при отключении библиотеки.
DLL_THREAD_ATTACH – создание процессом, подключившим DLL, нового потока. Зачем DLL знать о каких-то там потоках? А вот зачем, далеко не каждая динамическая библиотека может работать в многопоточной среде.
DLL_THREAD_DETACH – завершение потока, созданного процессом, подключившим DLL. Если динамическая библиотека создает для каждого потока свои "персональные" ресурсы (локальные переменные и буфера), то это уведомление позволяет их своевременно освобождать.
Опять же, в тему структуры DLL можно углубляться до бесконечности, там есть много различных нюансов, о которых немного изложено в этой статье.
У DllMain не так много аргументов, самый важный fdwReason уже рассмотрен выше, теперь о двух других:
- Аргумент lpvReserved указывает на способ подключения DLL:
- 0 — библиотека загружена с явной компоновкой.
- 1 — библиотека загружена с неявной компоновкой.
О явной и неявной компоновке можно прочесть подробно в статье: Связывание исполняемого файла с библиотекой DLL.
В предложенном на рисунке 1 шаблоне есть функция SomeFunction , которая может быть экспортирована из динамической библиотеки. Для того, чтобы это показать, при объявлении функции указывается __declspec(dllexport) . Например, так:
Функции, не объявленные таким образом, нельзя будет вызывать снаружи.
DLL & Python
Первым делом, расскажу, как подключать уже собранные DLL, затем, как вызывать из них функции и передавать аргументы, а уже после этого, постепенно доделаю шаблон из Code Blocks и приведу примеры работы с собственной DLL.
Подключение DLL
Основной библиотекой в Python для работы с типами данных, совместимыми с типами языка С является ctypes . В документации на ctypes представлено много примеров, которым стоит уделить внимание.
Чтобы начать работать с DLL, необходимо подключить библиотеку к программе на Python. Сделать это можно тремя способами:
- cdll — загружает динамическую библиотеку и возвращает объект, а для использования функций DLL нужно будет просто обращаться к атрибутам этого объекта. Использует соглашение вызовов cdecl.
- windll — использует соглашение вызовов stdcall. В остальном идентична cdll.
- oledll — использует соглашение вызовов stdcall и предполагается, что функции возвращают код ошибки Windows HRESULT. Код ошибки используется для автоматического вызова исключения WindowsError.
Для первого примера будем использовать стандартную Windows DLL библиотеку, которая содержит всем известную функцию языка С — printf() . Библиотека msvcrt.dll находится в папке C:\WINDOWS\System32 .
Код Python:
Результат:
Можно использовать подключение библиотеки с помощью метода windll либо oledll , для данного кода разницы не будет, вывод не изменится.
Если речь не идет о стандартной библиотеке, то конечно следует использовать вызов с указанием пути на dll. В ctypes для загрузки библиотек предусмотрен метод LoadLibrary . Но есть еще более эффективный конструктор CDLL , он заменяет конструкцию cdll.LoadLibrary . В общем, ниже показано два примера вызова одной и той же библиотеки msvcrt.dll.
Код Python:
Иногда случается, что необходимо получить доступ к функции или атрибуту DLL, имя которого Python не "примет"… ну бывает. На этот случай имеется функции getattr(lib, attr_name) . Данная функция принимает два аргумента: объект библиотеки и имя атрибута, а возвращает объект атрибута.
Код Python:
Результат:
Теперь становится понятно, как подключить библиотеку и использовать функции. Однако, не всегда в DLL нужно передавать простые строки или цифры. Бывают случаи, когда требуется передавать указатели на строки, переменные или структуры. Кроме того, функции могут и возвращать структуры, указатели и много другое.
Типы данных в С и Python
Модуль ctypes предоставляет возможность использовать типы данных совместимые с типами в языке С. Ниже приведена таблица соответствия типов данных.
Сtypes type C type Python type c_bool _Bool bool (1) c_char char 1-character string c_wchar wchar_t 1-character unicode string c_byte char int/long c_ubyte unsigned char int/long c_short short int/long c_ushort unsigned short int/long c_int int int/long c_uint unsigned int int/long c_long long int/long c_ulong unsigned long int/long c_longlong __int64 or long long int/long c_ulonglong unsigned __int64 or unsigned long long int/long c_float float float c_double double float c_longdouble long double float c_char_p char * (NUL terminated) string or None c_wchar_p wchar_t * (NUL terminated) unicode or None c_void_p void * int/long or None Таблица 1 — Соответствие типов данных языка Python и языка C, которое предоставляет модуль ctypes .
Первое, что стоит попробовать — это использовать указатели, куда без них? Давайте напишем программу, где создадим строку и указатель на неё, а потом вызовем printf() для них:
Результат:
Если вы создали указатель, то разыменовать (получить доступ к значению, на которое он указывает) можно с использованием атрибута value , пример выше.
Аргументы функций и возвращаемые значения
По умолчанию предполагается, что любая экспортируемая функция из динамической библиотеки возвращает тип int . Другие возвращаемые типы можно указать при помощи атрибута restype . При этом, чтобы указать типы аргументов функции можно воспользоваться атрибутом argtypes .
Например, стандартная функция strcat принимает два указателя на строки и возвращает один указатель на новую строку. Давайте попробуем ей воспользоваться.
Код Python:
Результат:
На этом закончим с примерами использования готовых DLL. Давайте попробуем применить знания о структуре DLL и модуле ctypes для того, чтобы собрать и начать использовать собственную библиотеку.
Своя DLL и ее использование
Пример 1
Шаблон DLL уже был рассмотрен выше, а сейчас, когда дело дошло до написания своей DLL и работы с ней, выскочили первые и очевидные грабли — несовместимость разрядности DLL и Python. У меня на ПК установлен Python x64, оказалось, что как бы не были DLL универсальны, разрядность DLL должна соответствовать разрядности Python. То есть, либо ставить компилятор x64 и Python x64, либо и то и то x32. Хорошо, что это не сложно сделать.
Ниже привожу код шаблона DLL, в который добавил вывод строки при подключении библиотеки, а также небольшой разбор и вывод аргументов, с которыми вызвалась DllMain . В примере можно понаблюдать, какие участки кода библиотеки вызываются и когда это происходит.
Код DLL на С:
Код Python:
Функция SomeFunction получает указатель на строку и выводит её в окно. На рисунке ниже показана работа программы.
Рисунок 2 — Демонстрация работы шаблона библиотеки из Code Blocks.
Все действия происходящие в кейсе DLL_PROCESS_ATTACH , код которого приведен ниже, вызываются лишь одной строкой в Python коде:
Рисунок 3 — Действия происходящие при подключении DLL.
Пример 2
Чтобы подвести итог по использованию DLL библиотек из Python, приведу пример, в котором есть начальная инициализация параметров и передача новых через указатели на строки и структуры данных. Этот код дает понять, как написать аналог структуры С в Python. Ниже привожу код main.c , man.h и main.py .
Код DLL на С:
В коде main.h определена структура Passport с тремя полями: два указателя и целочисленная переменная. Кроме того, четыре функции объявлены, как экспортируемые.
Код DLL на С:
Внутри кейса DLL_PROCESS_ATTACH происходит выделение памяти под строки и начальная инициализация полей структуры. Выше DllMain определены функции:
GetPassport — вывод полей структуры passport в консоль.
*SetName(char new_name)** — установка поля name структуры passport .
*SetSurname(char new_surname)** — установка поля surname структуры passport .
*SetPassport(Passport new_passport)** — установка всех полей структуры passport . Принимает в качестве аргумента указатель на структуру с новыми полями.
Теперь можно подключить библиотеку в Python.
Код на Python
В коде выше многое уже знакомо, кроме создания структуры аналогичной той, которая объявлена в DLL и передачи указателя на эту структуру из Python в DLL.
Результат:
Ошибка возникает в результате невозможности загрузки библиотеки, необходимой для работы программы.
Часто такая ошибка возникает на устройствах, в которых используется несколько графических адаптеров, например ноутбуки с процессорами Intel, имеющими встроенную графику Intel HD Graphics и с дискретным GPU, или же на стационарных компьютерах с процессорами Intel или AMD Ryzen с припиской G (что означает наличие встроенной графики) в комплекте с дискретным графическим адаптером. В нашем случае это произошло с программой Viber.
Причина появления данной проблемы – включенный режим энергосбережения.
Первым делом перейдите в Панель управления – Электропитание. Установите схему производительности: «Высокая производительность» или «AMD Ryzen™ High Performance» (для процессоров AMD Ryzen).
Если планов «Высокая производительность» или «AMD Ryzen™ High Performance» нет – необходимо установить драйвер ACPI.
Так же, если у Вас установлена дискретная графика от AMD, примените режим высокой производительности в настройках Catalyst Control Center: Питание – Глобальные параметры переключаемой графики, установите «Максимальная производительность». Если это ноутбук, то установите «Максимальная производительность» и в графе «Подключено», и в графе «Батарея», для того, чтобы эти схемы питания применялись и при питании от сети, и при питании от батареи.
Так же в Catalyst Control Center удостоверьтесь, что в разделе «Параметры приложений переключаемой графики» проблемное приложение имеет схему «Максимальная производительность».
В том случае, если дискретная видеокарта – NVIDIA, откройте Панель управления NVIDIA – Параметры 3D – Управление параметрами 3D. В разделе «Глобальные параметры» найдите параметр «Режим управления электропитанием» и установите «Предпочтителен режим максимальной производительности». Так же удостоверьтесь, что в разделе «Программные настройки» для проблемной программы установлена схема максимальной производительности.
Антон Зеленко запись закреплена
Назар Михайлов
Игорь, вот нашёл, вроде Java переустановить нужно. Вечером попробую
Никакой явы не стоит, поставилось легко и просто даже на последнюю инсайдерку. А QR код и мобильный вайбер круто придумали. А каспер ваш случаем вдруг сьёл длл вайбера. И полностью удалять лучше revo uninstailerom
А ещё чую у вас ноут и я знаю как решить эту проблему.Да, ноутбук. Расскажи если знаешь
Антон, рассказывать долго целых
57сек, так что могу показать.Александр, Спасибо
Назар Михайлов ответил Антону
Назар Михайлов ответил Александру
Назар Михайлов ответил Александру
Назар Михайлов ответил Антону
Назар, ну если нет пункта, то скорее драйвера или иные стоят не поддерживают этот твик. Можно конечно всё добавить через реестр не достающее, но где там что лежит, там параметров питания может быть за 100 штук которых щас вы не видите. Прикиньте всё включать. Делов там на 10мин, просто в этих 100 параметрах ставить 0 вместо 1 чтоб они появились в этой схеме питания.
Александр, проще оставить все как есть. Пользуюсь десктопной версией Viber для win 10. Место версии Viber для ПК
Антон, заметил, что с ноутами всегда какие то проблемы из за того, что игры с софт не понимают с какой видео работать. Быть может если поставить режим высокой производительности всё станет на макс.быстродействие даже отсутствующие параметры.
С ошибкой «LoadLibrary Failed with the Error 1114: Произошел сбой в программе инициализации библиотеки динамической компоновки (DLL)» чаще всего пользователи сталкиваются при запуске игр. Также она может препятствовать запуску программ обработки анимации и изображений, таких как Photoshop и Autodesk 3ds Max. Иногда из-за этой ошибки не удается использовать Вайбер или некоторые приложения Windows.
Самые распространенные причины связаны с настройками питания видеокарты или повреждением файлов DLL.
Изменения параметров электропитания
Откройте Панель управления командой control , запущенной из окна Win + R.
Переключите просмотр на крупные значки и перейдите в раздел Электропитания.
Нажмите на кнопку настройки схемы электропитания в соответствии с используемым планом.
В следующем окне кликните на «Изменить дополнительные параметры питания».
В списке разверните вкладки: Переключаемые графические адаптеры – Глобальные параметры. Щелкните поочередно на раскрывающие списки от батареи и то сети и измените значение из оптимальной на максимальную производительность.
Примените правки, и перезагрузите компьютер. Попробуйте запустить то приложение, которое вызывало сбой в программе инициализации библиотеки с кодом 1114.
Примечание: Если вкладка «Переключаемые графические адаптеры» отсутствует в списке, попробуйте активировать схему электропитания «Высокая производительность» и проверьте, решена ли проблема.
Установите автоматический запуск службы политики диагностики
Откройте системные службы командой services.msc , запущенной из окна Win + R.
Найдите службу политики диагностики, щелкните на ней правой кнопкой мыши и выберите «Свойства». Затем щелкните на раскрывающий список типа запуска и выберите значение «Автоматически». Нажмите на кнопку «Запустить» и примените изменения.
Перезапустите ПК и откройте программное обеспечение, которое вызывало ошибку с кодом 1114.
Проверка системных файлов
Ошибку могут вызвать поврежденные файлы Windows, в частности библиотеки динамической компоновки DLL. Для проверки целостности системы используем утилиты SFC и DISM, которые работают через консоль командной строки.
Запустите командную строку от имени администратора с помощью поиска Windows.
Запустите в консоли сканирование sfc /scannow и дождитесь его завершения.
dism /online /cleanup-image /restorehealth
Перед выполнением проверьте подключение к интернету. Не прерывайте сканирование, пока процесс не достигнет 100%.
После завершения перезапустите ПК и выполните то действие, которое приводило к ошибке LoadLibrary Failed with Error 1114.
Читайте также: