Минимальный набор файлов, необходимый для распространения кода, скомпилированного с помощью встроенного Cython, и обеспечения его работы на любой машине
TL;DR: как использовать Cython в качестве метода распространения вместо Py2exe, cx_freeze, pyinstaller и т. Д.
После создания исполняемого файла в Cython я хотел бы увидеть, как можно было бы распространить программу Python любому пользователю Windows (у которого еще не установлен Python на его машине), скомпилировав ее сначала с помощью Cython.--embed
.
Давайте использовать test.py
:
import json
print(json.dumps({'key': 'hello world'}))
и скомпилируйте его:
cython test.py --embed
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64
cl test.c /I C:\Python37\include /link C:\Python37\libs\python37.lib
Он работает и производит 140 КБ test.exe
исполняемый файл.
Бег test.exe
на другой машине не работает "из коробки", требует:
- python37.dll в той же папке
- для установки обычного файла vc_redist.x64.exe
Даже с этим он по-прежнему не работает (снимок экрана ниже вместо копирования / вставки, потому что я не управлял копированием / вставкой в виртуальной машине - здесь не по теме):
ModuleNotFoundError: нет модуля с именем "encodings"
Вопрос: какой минимальный набор файлов необходим для распространения --embed
-Cython-скомпилированный код и заставить его работать на любой машине (без предварительно установленного Python)?
1 ответ
После дальнейшего исследования (я пробовал использовать пустую виртуальную машину Win 7 x64, без предварительно установленного VCredist), кажется, что этих файлов достаточно:
сама программа,
test.exe
(произведеноcython --embed
и компиляция сcl.exe
)python37.dll
python37.zip
поступает из пакетов с именем "Windows x86-64 Embeddable zip file" в https://www.python.org/downloads/windows/vcruntime140.dll
, как упоминалось в разделе Могу ли я связать распространяемую DLL Visual Studio 2015 C++ с моим приложением? или попросите пользователя установить vc_redist.x64.exe передucrtbase.dll
более 30 файлов
api-ms-win-*.dll
тоже требовались; в противном случае вы получите следующую ошибку:... api-ms-win-crt-runtime-l1-1-0.dll отсутствует...
Заметки:
если вам нужна другая библиотека, например
pygame
, просто скопируйте / вставьте папку изC:\Python37\Lib\site-packages\pygame
кажется работаетдля меня concrt140.dll, msvcp140.dll, vccorlib140.dll не показались необходимыми