我正在使用 Windows 操作系统。我有 Visual Studio 以及与之相关的所有构建工具。我有简单的python脚本。我使用 cython 生成了一个“C”文件。我正在尝试将此 C 文件转换为可执行文件。我不想使用任何其他模块,如 pyinstaller、py2exe 或 cxFreeze。
从 .py 到 C 的转换成功。但是很遗憾,我在将此 C 文件转换为可执行文件时遇到了一些错误。
有人可以帮我吗?我已经检查了关于这个问题的各种其他问题,但没有一个有这个问题。
这是我的(.pyx 脚本)
from tkinter import Tk
root = Tk()
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
我在 CMD 中使用了以下命令来为此脚本构建 C 扩展:
python setup.py build_ext --inplace -DMS_WIN64
Run Code Online (Sandbox Code Playgroud)
然后我在 CMD 中使用这个命令来构建一个可执行文件:
gcc -DMS_WIN64 C:/Users/Siva/Desktop/Scripts/TEST/test.c -IC:/"Program Files"/Python37/include -LC:/"Program Files"/Python37/libs -lpython37 -o output
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误:
C:\Users\Siva\Desktop\Scripts\TEST>gcc -DMS_WIN64 C:/Users/Siva/Desktop/Scripts/TEST/test.c -IC:/"Program Files"/Python37/include -LC:/"Program Files"/Python37/libs -lpython37.a -o output
C:/Users/Siva/Desktop/Scripts/TEST/test.c:213:41: warning: division by zero [-Wdiv-by-zero]
enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) };
^
C:/Users/Siva/Desktop/Scripts/TEST/test.c:213:12: error: enumerator value for '__pyx_check_sizeof_voidp' is not an integer constant
enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) };
^~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
我附上了下面错误的截图
小智 5
终于经过漫长的永恒斗争,我找到了解决方案。感谢约书亚的大力支持。
.PYX 代码中有一个小的修改。看起来我们必须在函数中定义所有内容,以便当代码转换为 C 语言时,它有一个 main 函数。
所以第一步是将 .PYX 编辑为:
from tkinter import Tk
cdef public void function():
root = Tk()
root.mainloop()
if __name__ == "__main__":
function()
Run Code Online (Sandbox Code Playgroud)
然后我用下面的命令生成头文件(.h)和C程序文件
python -m cython test.pyx --embed
Run Code Online (Sandbox Code Playgroud)
这是诀窍:
转到生成的 C 程序文件并搜索 wmain 函数并从中删除“w”。或者你可以直接 Ctrl + F 搜索 wmain 并用 main 替换它的实例。
例如,在我的程序中只有一个 wmain 实例。我把它改成了主要的。它看起来像下面显示的代码。只需将 wmain 更改为 main。
#if PY_MAJOR_VERSION < 3
int main(int argc, char** argv) {
#elif defined(WIN32) || defined(MS_WINDOWS)
int wmain(int argc, wchar_t **argv)
Run Code Online (Sandbox Code Playgroud)
然后我使用 GCC 命令生成可执行文件。命令如下。我不明白为什么它有效。但确实如此。
x86_64-w64-mingw32-gcc-8.1.0 -mconsole -DSIZEOF_VOID_P=8 -DMS_WIN64 C:/Users/Siva/Desktop/Scripts/CYTHON/test.c -IC:/"Program Files"/Python37/include -LC:/"Program Files"/Python37/libs -lpython37 -o output
Run Code Online (Sandbox Code Playgroud)
我只希望有人能解释为什么方法有效。