经过几个小时的努力,我终于设法将我的Python代码转换为C,然后转换为exe文件,以查找导入是否正常工作。我想知道是否有人知道如何让它包括一切?我的所有搜索都没有提出任何建议。
我不确定它是否会有所作为,但这就是我的做法:
--inplace
选项未使用setup.py
(因为它会生成一个不会编译的C文件),所以我通过它完成了命令行cython --embed -o main.c main.py
。
我将Python中的libs
和include
文件夹复制到另一个文件夹中,并从那里编译C文件。我尝试运行脚本时出现错误:
Traceback (most recent call last):
File "start_tracking.py", line 5, in init start_tracking (start_tracking.c:1133)
ImportError: No module named core.constants
如何在生成的C代码中包含所有导入(不只是将所有内容复制到一个文件中)?
答案 0 :(得分:2)
{您可能希望在这里使用带轮子的cx_freeze https://www.google.com/url?sa=t&source=web&rct=j&url=https://anthony-tuininga.github.io/cx_Freeze/&ved=0ahUKEwjxuufa7uDUAhUR0GMKHW9YCJoQFgggMAA&usg=AFQjCNExxKVSPXU3tHdi6ahNqoekGMC1Eg,似乎做了很多或者相当多的问题https://pypi.python.org/pypi/cx_Freeze}
好的,这并不是完全回答你的问题,但它应该有效(尽管不是你采取的方法)。我将为您提供一个巨大的下载链接,您可以在其中放入(v3.5).py文件并继续。在你的情况下,.py文件会通过import语句调用你编译的Cython PYD(如果你实际上包括你自己的Cython模块),然后是你正在调用的其他代码。我认为拥有一个包含所有导入的整个exe会很棒,但是很多包需要DLL或PYD文件来运行,所以你的构建总是至少有一个exe,Python解释器及其所有依赖项(比如Python3x)。 DLL)。你可以尝试:memimporter和zipextimporter,它们能够从内存/ zip-archives中加载.pyd文件,而无需将它们解压缩到文件中,但这只是允许你将所有扩展模块放在一个zip文件中进行分发(并且可能会减慢需要PYD和DLL加载速度,但我没有看到这些方法的基准测试。)
如果您碰巧在上面使用1个拉链包进行扩展模块,请告诉我您的代码更改!这已包括NumPy,SciPy,Pandas,并针对英特尔MKL构建。使用的参考链接:https://stackoverflow.com/a/44610044/6037118理想情况下,我会扩展该链接的方法,在.py文件上使用一些加密算法,这些算法将在运行时解密。直接下载在这里,但你应该看到我的其他链接澄清用法:https://www.dropbox.com/sh/2smbgen2i9ilf2e/AADI8A3pCAFU-EqNLTbOiUwJa?dl=0我应该注意你编译的PYD及其相关的DLL也应该在使用Visual Studio 2015编译的子文件夹中的extension_modules
中x64 for Windows版本。该链接不会在Linux上运行。
答案 1 :(得分:1)
我遇到了同样的问题。我遵循this link将所有模块都包含在我的pyx根文件中。但是,如果该模块导入了另一个模块,则会遇到导入错误。
经过一番研究,我使用stickytape转换为单个python文件,例如main.py。然后
cython --embed -o main.c main.py
gcc main.c -I /usr/include/python3.5m -L / usr / lib / x86_64-linux-gnu / -o main -lpython3.5m -lpthread -lm -lutil -ldl
中提琴,我有一个可运行的c可执行文件,它是通过python转换的