Как скомпилировать мультимодульный cythonized проект для win10? - PullRequest
1 голос
/ 20 марта 2020

Я работаю над проектом 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, заработает.

...