Скомпилируйте расширение Python для другой среды выполнения C ++ - PullRequest
0 голосов
/ 21 февраля 2019

Я разрабатываю плагин для медиа-сервера Plex.Plex использует Python 2.7 для системы плагинов.Мне нужно использовать пакет python-levenshtein, который нужно скомпилировать для разных систем.

Я нашел колеса python-Levenshtein (manylinux, macos, arm, windows), но колесо для Windows скомпилировано с VS 2008 (msvcr90.dll).И в plex встроен python, скомпилированный с VS 2013 (msvcr130.dll).

Находясь в Windows 10, как я могу скомпилировать пакет python с разными средами выполнения VS?

1 Ответ

0 голосов
/ 21 февраля 2019

Примечание: компиляция расширений для версий Python, отличных от официальных выпусков, не поддерживается командой Python и должна поддерживаться продуктом - в данном случае Plex.Таким образом, если предположить, что Plex не предоставил способ сделать это, все ниже - хаки и обходные пути.

Кроме того, если разработчик библиотеки не выполняет сборки, вы пытаетесь покрыть их, что означает, что выв основном на своем «уровне» и должны знать свой код так же хорошо, как и они.Добро пожаловать в программное обеспечение с открытым исходным кодом:)

Наконец, это относится только к устаревшему Python 2. Если кто-то читает это на Python 3.5 или более поздней версии, просто установите последнюю версию Visual Studio и используйте последнюю версиюкомпилятор - вся строка 14.x совместима и будет отлично работать с последними версиями Python.


Предполагая, что вы внимательно следите за тем, как расширение взаимодействует с C Runtime, часто безопасно компилировать ваширасширение против «неправильной» C-версии.Здесь следует обратить внимание:

  • выделение памяти, которая будет освобождена Python
  • освобождение памяти, выделенной Python
  • передача / получение файловых дескрипторов илиFILE* указатели на / из Python
  • установка любых глобальных настроек, таких как кодировка или локаль
  • запись в стандартные потоки

Если все они изолированы, то выу вас просто останется две среды выполнения C в памяти, и они не будут пытаться взаимодействовать.


Теперь, если по какой-то причине это невозможно, вы можете попробовать скомпилировать расширение, используяпозже набор инструментов.Самый простой способ сделать это:

  • получить исходный код (я предполагаю, что setup.py сборка через колесо)
  • открыть VS 2013 Developer Command Command
  • run set DISTUTILS_USE_SDK=1 (это обойдет обнаружение MSVC)
  • run set MSSdk=1 (также необходимо для обхода обнаружения на устаревшем Python 2)
  • run python setup.py bdist_wheel (может потребоваться установкаwheel сначала в Python)

Теперь вы можете взять файл колеса и установить его, как обычно, например, путем извлечения / копирования файлов или передачи полного имени файла в pip.

В целом, очень велика вероятность, что простое создание расширения не удастся.В этом случае вам придется изменить исходный код, чтобы он работал - многие имена устарели и были удалены в трех версиях MSVC между VC 9.0 и VC 12.0, и поэтому вы не увидите предупреждений об устаревании ни для одного из них.

Если разработчик библиотеки уже заставил свою библиотеку работать с Python 3, многие исправления должны быть там, но могут не обнаруживаться (поскольку Python 3 либо использовал VC 10.0, который не нуждался в исправлениях, либоVC 14.x, который может быть обнаружен как _MSC_VER >= 1900 и не обнаружит VC 12.0).Они могут быть благодарны, если вы внесете какие-либо исправления, которые вы делаете, чтобы помочь следующему человеку, но многие разработчики библиотек отказываются от поддержки версий Python до 3.5 и сейчас, и поэтому они могут быть не заинтересованы в поддержке устаревшей поддержки.

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