Python 2.7 не может загрузить DLL (встроенный VC2017) из cmd.exe Windows 10 - PullRequest
0 голосов
/ 05 октября 2018

Добрый день!Я только что столкнулся с очень сложной проблемой, которую с трудом могу объяснить и решить.

У меня есть библиотека dll, скомпилированная в VC 2017. Эта библиотека по сути является модулем python: для создания интерфейсов использовалась оболочка SWIG.Таким образом, в данной папке у меня есть следующие файлы:

  • python.exe
  • python27.dll
  • TestLib.dll
  • TestLib.pyd
  • test_lib.py
  • load.py

Файл test_lib.py - это интерфейс, созданный SWIG.

Мой "load.py"скрипт:

from test_lib import *

Команда, которую я выполняю в оболочке:

python.exe load.py

Тесты

Если я запускаю эту команду в cmd.exe как обычный пользователь,Я получаю следующую ошибку:

Traceback (most recent call last):
  File "load.py", line 1, in <module>
    from test_lib import *
  File "test_lib.py", line 28, in <module>
    TestLib = swig_import_helper()
  File "test_lib.py", line 24, in swig_import_helper
    _mod = imp.load_module('TestLib', fp, pathname, description)
ImportError: DLL load failed: The specified module could not be found.

Кажется, что Windows или Python не могут загрузить модуль.Я проверил с помощью Dependency Walker зависимости dll и все вроде бы нормально.

Теперь странные вещи начинаются.

Если я выполняю ту же команду в cmd.exe с правами администратора, она работает!

Если я выполняю ту же команду в Powershell, что и обычный пользователь, она снова работает!


Анализ

Я взял инструмент Process Monitor и проанализировал каждую из них.три вызова.

  1. cmd.exe + обычный пользователь

  2. cmd.exe + admin или powershell.exe + обычный пользователь

Да, cmd + admin и powershell + normal демонстрируют одинаковое поведение.Вы можете видеть, что во всех трех вызовах после того, как команда QueryAllInformationFile получает статус BUFFER OVERFLOW, Windows начинает поиск библиотеки в разных местах ( почему ??? ).

В последних двух вызовахпосле проверки 2 альтернативных путей ( C: \ MyCompany \ Project \ Project \ Project \ Project \ Bin \ Win32 \ TestLib.pyd и C: \ Project \ Bin \ Win32 \ TestLib.pyd), Windows возвращается в исходное местоположение C: \ MyCompany \ Project \ Project \ Project \ bin \ Win32 \ TestLib.pyd и, наконец, начинает загружать DLL.

Однакоcmd.exe с правами обычного пользователя ведет себя по-другому.Windows пробует несколько каталогов, и кажется, что в конце процесс завершается, поскольку считается, что библиотека не найдена.( почему ??? )

Наконец, если я сделаю небольшой трюк и помимо его исходного местоположения, дополнительно скопируйте мою библиотеку в C: \ MyCompany \ Project \ Project \ Project \ Project\ Bin \ Win32 \ TestLib.pyd cmd.exe с правами обычного пользователя запускается без ошибок!Это смешно.


Вопросы

  1. Какого черта происходит с этим вызовом (cmd.exe + обычный пользователь)?

  2. Как я могу это исправить?

  3. Почему Windows пытается найти мою библиотеку в стольких местах, хотя она обнаруживает ее в первоначально указанном месте с самого первого шага?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...