Я работаю над проектом python3 .7, который включает в себя несколько модулей и импорт из распределенных пакетов (pyside2, scipy, ...). Проект был разработан, успешно размещен на cthon и скомпилирован под Ubuntu. Теперь моя задача - создать файл .exe для windows 10.
. Я пытаюсь применить к windows 10 ту же самую процедуру cythonize-and-compile, которая работала в Ubuntu:
Я записал все мои модули, кроме main.py, с:
python cythonizer.py build_ext --inplace
cythonizer.py, содержащий:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [
Extension("datatools", ["datatools.py"]),
Extension("logger_conf", ["logger_conf.py"]),
Extension("serialization", ["serialization.py"]),
Extension("UimainWindow", ["UimainWindow.py"]),
Extension("UiprojectsFrame_newProject", ["UiprojectsFrame_newProject.py"]),
Extension("UiprojectsFrame_projectInfo", ["UiprojectsFrame_projectInfo.py"]),
Extension("UiprojectsFrame", ["UiprojectsFrame.py"]),
Extension("units_and_formats", ["units_and_formats.py"]),
]
for e in ext_modules:
e.cython_directives = {'language_level': "3"}
setup(
name = 'aircraft2020-v0.10',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules
)
Затем я цитонизировал свой основной модуль с опцией встраивания:
cython main.py --embed -3
Сделав это, я произвел. c файлы из моих .py файлов. Следующим шагом является компиляция файлов. В Ubuntu я успешно использовал g cc, в windows 10 на компьютере нет g cc, но есть visual studio, поэтому я попытался:
cl.exe / nolo go / Ox / MD / W3 / GS- / DNDEBUG -I {PythonPath} \ include -I {PythonPath} \ P C {all_my_.c_files_here} / link /OUT:"myProgram.exe "/ SUBSYSTEM: CONSOLE / MACHINE: X86 / LIBPATH: {PythonPath} \ libs / LIBPATH: {PythonPath} \ PCbuild
{PythonPath} и {all_my_.c_files_here} на самом деле являются очень длинными путями и списком, поэтому я не стал Скопируйте его полностью здесь для удобства чтения.
Это компилирует .exe. Но при попытке его выполнения происходит сбой мгновенно. Выполнение этого в командной строке останавливается на ошибке, указывающей, что он не может найти первый модуль, который вызывается для импорта:
Traceback (most recent call last):
File "main.py", line 11, in init main
ModuleNotFoundError: No module named 'serialization'
Если я переместлю исходные файлы .py в папку, это работает! Но, очевидно, я не хочу исходный файл в выпущенных файлах. Я думаю, что-то не так в том, как модули импортируются в скомпилированный исполняемый файл. Кто-нибудь знает, что мне не хватает?
Спасибо за вашу помощь!
РЕДАКТИРОВАТЬ: благодаря комментарию EAD я понял, где я запутался. Обычно в linux я не понимал, почему я не получаю файлы .so, и предполагал, что cl поместит все в .exe.
На самом деле в windows файлы .so - это файлы .pyd. Команда cl должна использоваться для компиляции только основных. c, а не других. c файлов.
Затем, просто поместив файлы .pyd в ту же папку, что и .exe, заработает.