(Извините, я сделал глупость, сначала написал вопрос, а затем зарегистрировался, и теперь я не могу изменить его или прокомментировать ответы, потому что движок StackOverflow не считает меня автором. Я даже не могудолжным образом поблагодарите тех, кто ответил :( Так что это фактически обновление к вопросу и комментариям.)
Спасибо за все советы, это очень ценно. Насколько я понимаю, с некоторыми усилиями я могу статически связать Python впользовательская библиотека DLL, при условии, что я сам собираю другие динамически загруженные расширения и связываю их с той же библиотекой DLL. (Я знаю, что мне нужно также поставить стандартную библиотеку; мой план заключался в добавлении архива в формате DLL в файл DLL. Насколько яПонимаю, я даже смогу импортировать из него чистые модули Python.)
Я также нашел интересное место в dynload_win.c
. (насколько я понимаю, он загружает динамические расширения, использующие Python C API, например, _ctypes
.) Насколько я вижу, он не только ищет символ init_ctypes
или какое-либо другое имя расширения, но также сканирует .pyd
.Таблица импорта файла ищет (regex) python\d+\.
, а затем сравнивает найденный символ с известной строкой pythonNN.
, чтобы убедиться, что расширение было скомпилировано для этой версии Python.Если таблица импорта не имеет такого символа или относится к другой версии, возникает ошибка.
Для меня это означает, что:
- Если я свяжу расширение с
pythonNN.dll
и попытаюсь загрузить его из моей пользовательской библиотеки DLL, которая включает в себя статически связанный Python, она пройдетпроверить, но - ну, здесь я не уверен: произойдет ли сбой, потому что нет pythonNN.dll
(т.е. даже до того, как попасть на проверку), или он с радостью загрузит символы? - И если я свяжу этопротив моей пользовательской библиотеки DLL, он найдет символы, но не пройдет проверку :) Я думаю, я мог бы переписать этот кусок в соответствии со своими потребностями ... Есть ли еще такие места, яИнтересно.