使用f2py编译模块复杂的Cython嵌入式可执行文件

Lia*_*con 8 python embed cython f2py

我正在尝试cython化一个python项目,该项目位于https://pypi.python.org/packages/source/p/phaseshifts/phaseshifts-0.1.2-dev.zip,其最终目标是为phsh创建一个独立的可执行文件. py模块.我希望嵌入的项目的核心结构具有以下层次结构:

phaseshifts/
    __init__.py
    atorb.py
    conphas.py
    elements.py
    leed.py
    phsh.py
    lib/
        __init__.py
        libphsh.pyd`
Run Code Online (Sandbox Code Playgroud)

注意:libphsh.pyd模块使用编译f2py.

我想我的问题实际上分为多个部分:

1)如何使用cython创建包含多个.py[x]?文件的独立可执行文件?(比如使用--embed单个模块的选项来嵌入python解释器时)
2)如果1)是可能的,那么可以编译.pyd.so包含文件,如果是,如何?

非常感谢SO退伍军人的任何帮助:-)

编辑

到目前为止,粗略的解决方法是编译libphsh.f成dll,gfortran -shared -o libphsh.dll libphsh.f然后编辑相关的源文件以使用ctypes加载库.接下来,我使用cython *.py创建每个Python模块我希望,除了phsh.py,其中I使用的C源文件cython --embed phsh.py.

最后,我使用GCC编译源代码并链接到python库,例如

gcc -o phsh.exe phsh.c __init__.c atorb.c conphas.c elements.c leed.c model.c \
-I"C:\Python27\include" -L"C:\Python27\libs" -lpython27
Run Code Online (Sandbox Code Playgroud)

但是,在运行已编译的可执行文件时,应用程序终止显示消息:

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
Run Code Online (Sandbox Code Playgroud)

编辑2

使用g++编译生成的cpp源文件可以避免异常终止:

cython --cplus --embed phsh.py
Run Code Online (Sandbox Code Playgroud)

事实上,第一次编辑中列出的要点都很费力而且不起作用,因为编译的可执行文件仍然尝试导入每个python模块,因此每个模块也可以编译,但最重要的一步是编译libphsh.f:

f2py -m libphsh libphsh.f
Run Code Online (Sandbox Code Playgroud)

下一步是尝试使用设置脚本自动执行此操作...