Python 如何为win10编译多模块cythonized项目?
我正在从事一个python3.7项目,该项目涉及多个模块,并从分布式软件包(pyside2,scipy,…)导入。该项目是在ubuntu下成功开发、实现和编译的。我现在的任务是为windows 10创建一个.exe文件 我试图在windows 10上应用与ubuntu相同的cythonize和compile过程: 除了main.py之外,我对所有模块进行了cythonization,包括: python cythonizer.py build_ext——就地 cythonizer.py包含:Python 如何为win10编译多模块cythonized项目?,python,python-3.x,windows,compilation,cython,Python,Python 3.x,Windows,Compilation,Cython,我正在从事一个python3.7项目,该项目涉及多个模块,并从分布式软件包(pyside2,scipy,…)导入。该项目是在ubuntu下成功开发、实现和编译的。我现在的任务是为windows 10创建一个.exe文件 我试图在windows 10上应用与ubuntu相同的cythonize和compile过程: 除了main.py之外,我对所有模块进行了cythonization,包括: python cythonizer.py build_ext——就地 cythonizer.py包含: f
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
)
然后,我使用嵌入选项对我的主模块进行了cythonization:
cython main.py--嵌入-3
为此,我从.py文件生成了.c文件。
下一步是编译这些文件。在ubuntu上,我成功地使用了gcc,在windows 10上,计算机没有gcc,但有visual studio,因此我尝试:
cl.exe/nologo/Ox/MD/W3/GS-/DNDEBUG-I{PythonPath}\include-I{PythonPath}\PC{all_my.c_files_here}/link/OUT:“myProgram.exe”/SUBSYSTEM:CONSOLE/MACHINE:X86/LIBPATH:{PythonPath}\libs/LIBPATH:{PythonPath}\PCbuild
{PythonPath}和{all_my_u.c_files_here}实际上是很长的路径和列表,因此为了可读性,我没有将其完全复制到这里
这将编译一个.exe。但试图执行它会立即崩溃。在命令提示符下执行时,它会在出现错误时停止,该错误指示它找不到为导入而调用的第一个模块:
Traceback (most recent call last):
File "main.py", line 11, in init main
ModuleNotFoundError: No module named 'serialization'
如果我将.py源文件移动到文件夹中,它就会工作!但很明显,我不希望源文件出现在realeased文件中。我猜在编译的可执行文件中导入模块的方式有问题。有人知道我错过了什么吗
谢谢你的帮助
编辑:
多亏了ead的评论,我才明白自己的困惑所在。通常在linux下,我不理解为什么我没有得到.so文件,并且认为cl会把所有东西都放在.exe中
事实上,在windows下.so文件是.pyd文件。cl命令应仅用于编译main.c文件,而不用于编译其他.c文件
然后,只需将.pyd文件与.exe文件放在同一文件夹中,即可使其正常工作。我认为对正在发生的事情存在误解。cythonizer.py创建扩展名(pyd文件),并在调用“import xxxx”时导入这些扩展名。如果您的exe没有找到pyd(py)文件,它将失败(它不知道该功能实际上是由链接器打包到exe中的)。这是否回答了您的问题?谢谢你,你的评论让我意识到我哪里弄糊涂了,我将用解决方案编辑OP,谢谢。我认为这是对正在发生的事情的误解。cythonizer.py创建扩展名(pyd文件),并在调用“import xxxx”时导入这些扩展名。如果您的exe没有找到pyd(py)文件,它将失败(它不知道该功能实际上是由链接器打包到exe中的)。这是否回答了您的问题?谢谢你,你的评论让我意识到我哪里弄糊涂了,我会用解决方案编辑OP,谢谢