Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Cython将具有多个依赖项的纯Python项目转换为C代码_Python_Python 3.x_Cython - Fatal编程技术网

使用Cython将具有多个依赖项的纯Python项目转换为C代码

使用Cython将具有多个依赖项的纯Python项目转换为C代码,python,python-3.x,cython,Python,Python 3.x,Cython,我知道这似乎是一个已经被问了好几次的问题,尽管有点不同 我对cython非常陌生,就像从昨天开始才开始了解它一样,并且知道它可以在GCC的帮助下用于将纯python代码转换为二进制可执行文件 我有一个具有多个依赖项的大型Python项目,包括stanfordner、spacyner、一些定制的纯Python依赖项和一些核心Python库。我想将这个包含多个代码文件的整个项目转换为一个可执行文件,但在此之前,我想将其转换为一个c类型的文件,该文件可以通过GCC转换为一个可执行文件 现在,我知道使用

我知道这似乎是一个已经被问了好几次的问题,尽管有点不同

我对cython非常陌生,就像从昨天开始才开始了解它一样,并且知道它可以在GCC的帮助下用于将纯python代码转换为二进制可执行文件

我有一个具有多个依赖项的大型Python项目,包括stanfordner、spacyner、一些定制的纯Python依赖项和一些核心Python库。我想将这个包含多个代码文件的整个项目转换为一个可执行文件,但在此之前,我想将其转换为一个c类型的文件,该文件可以通过GCC转换为一个可执行文件

现在,我知道使用cython嵌入选项可以将纯python文件转换为.C类型的文件,但这是否也会获取使用的依赖项,或者它只是将特定的.py文件转换为.C文件。此外,自定义依赖项在它们内部使用一些其他自定义依赖项,因此,当我转换主驱动程序代码时,它还会捕获所有底层依赖项吗


我已经研究过Pyinstaller和Py2Exe,但这并不完全符合我的目的,因为我想要一个可以在以后编译的.C代码

免责声明:我不确定我是回答这个问题的最佳人选

我不认为cython非常适合您想要做的事情(即将大型python项目自动转换为C)。Cython sill的使用需要付出相当大的努力(您需要指定类型,通常需要重新安排代码。有时,为更复杂的对象(例如numpy数组)指定适当的类型相当困难)

老实说,我在cython(
.pyx
)中使用第三方库方面没有太多经验,因为我使用cython完全是为了相反的目的(用cython编写低级性能关键计算核心(没有依赖项),而不是用高级python脚本导入)。我认为这就是预期的用例

=>


我会遵循这一策略——只使用cython编写最少的代码,而不是使用外部高级python作为粘合语言来绑定外部库。

我认为这是不对的。Cython应该能够编译大多数Python代码而不改变(而且实际上做得很好)。这显然不适合OP的建议,但不是因为你所建议的原因。我在这里得到了答案,但这个过程似乎太复杂了,我甚至都无法理解。但我的理解是,我可以创建一个巨大的.py文件,然后将其转换为C,或者我可以将单个模块转换为SO文件,创建一个自定义导入器,如上面的回答所述,这样当编译.C文件时,它可以动态地拾取编译包的位置。我说得对吗?@KaranJ你对这两个选项的总结是对的。真正的挑战是处理外部依赖关系。我真的建议你使用PyInstaller(或类似的),他们可以捆绑已编译的Cython模块,这样你就可以满足你的要求(你的代码是compiled+big-exe)@DavidW-是的,Cython可以编译python代码,即使没有类型命名(如果你是这个意思),但是当它仍然像python一样慢的时候,目的是什么呢?(好的,也许这里的目标不是通过从python迁移到C来获得性能,但我不确定目标是什么)@ProkopHapala这里的目标似乎是拥有一个自包含的可执行文件,并且没有对速度做出任何声明。但是,是的,我同意如果你想提高性能,类型注释通常是一个好主意。你会注意到,这个问题的答案非常复杂,甚至没有涉及到试图捆绑Python标准库和所有其他依赖项(其中一些有自己的二进制模块)。不要这样做。这不是正确的工具