我正在使用Windows操作系统。我有Visual Studio和与其相关的所有构建工具。我有简单的python脚本。我用cython生成了一个“ C”文件。我正在尝试将此C文件转换为可执行文件。我不想使用其他任何模块,例如pyinstaller,py2exe或cxFreeze。
从.py到C的转换成功。但是可悲的是,在将此C文件转换为可执行文件时遇到了一些错误。
有人可以帮助我吗?我已经检查了有关此问题的其他各种问题,但都没有这个问题。
这是我的(.pyx脚本)
from tkinter import Tk
root = Tk()
root.mainloop()
我在CMD中使用以下命令为该脚本构建C扩展名:
python setup.py build_ext --inplace -DMS_WIN64
然后我在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
这会产生以下错误:
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*)) };
^~~~~~~~~~~~~~~~~~~~~~~~
我已附上以下错误的屏幕截图
答案 0 :(得分:1)
最后,经过长期的永恒奋斗,我找到了解决方案。感谢约书亚的大力支持。
.PYX代码进行了小的修改。看来我们必须在函数中定义所有内容,以便当代码转换为C语言时,它具有主要功能。
因此第一步是将.PYX编辑为:
from tkinter import Tk
cdef public void function():
root = Tk()
root.mainloop()
if __name__ == "__main__":
function()
然后,我使用以下命令来生成头文件(.h)和C程序文件
python -m cython test.pyx --embed
这是窍门:
转到生成的C程序文件,搜索wmain函数,然后从其中删除“ w”。或者,您也可以Ctrl + F搜索wmain并将其实例替换为main。
在我的程序中,例如,只有一个wmain实例。我将其更改为main。它看起来像下面显示的代码。只需将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)
然后,我使用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
我只希望有人能解释为什么方法有效。
答案 1 :(得分:0)
环境检查失败;自动检测可能已损坏。尝试以下方法之一对其进行覆盖:
.dropna()
其中gcc -DSIZEOF_VOID_P=8 -DMS_WIN64 ...
gcc -DSIZEOF_VOID_P=4 ...
常量用于64位输出,而8
常量用于32位输出。您很可能配置了64位并实际调用了32位gcc。如果是这样,则在假定还安装了64位定位4
的情况下,以下调用应该可以工作。
gcc