动态动态编译

时间:2018-03-12 15:34:30

标签: python cython on-the-fly

我有各自的函数(来自用户输入)用于绘图(x ^ 2,e ^ x,x,...),我将计算cython中的坐标。 我用exec在Python代码中创建了一个单独的函数,但这对我来说很慢。

我尝试生成单独的.pyx文件并将它们编译为.pyd文件(在Windows上)。

这是我生成单个.pyx文件并编译它们的方法。生成工作正常,但是当我没有从主脚本中的.pyd文件导入cython模块时,我只能编译它们。如果我编译它然后导入我的主类中的模块,它工作正常,但一旦导入,我不能再编译它。 (该文件用于测试,不存储x或y值)

def build(function):
    # code for .pyx file
    code = """cpdef long double computeIt(long double count):
    cdef long double i = 0
    cdef long double result = 0
    for i from 0 <= i < count:
        result = _compute(i)
    return result

cpdef long double compute(long double x):
    return _compute(x)
cdef long double _compute(long double x):
    return """ + function
    # end of code

    with open("evalTest.pyx", "w+") as file:
        file.truncate()
        file.write(code)

    os.system("python setup.py build_ext --inplace") # run setup file

setup.py文件来编译.pyx:

from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("evalTest.pyx")
)

此外,我尝试将其编译为临时文件,并使用原子操作替换.pyd文件,但随后我收到“权限被拒绝”错误(如果我以管理员身份运行脚本)。

如果我首先导入cython模块,然后尝试重新编译它,我得到:

  

LINK:致命错误LNK1104:无法打开文件   'C:\用户\亚历山大\桌面\ onTheFlyCythonCompile \ evalTest.cp36-win_amd64.pyd'

     

错误:命令'C:\ Program Files(x86)\ Microsoft Visual   工作室\ 2017年\社区\ VC \工具\ MSVC \ 14.11.25503 \ BIN \ HostX86 \ 64 \ LINK.EXE”   退出状态1104失败

我认为解释器持有模块而我无法访问它但我不知道这是否正确。我还尝试取消链接文件。

有什么建议可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

你是正确的解释器持有pyd。据我所知,在运行的python解释器中卸载c-extension模块实际上是不可能的。

处理此问题的最佳方法可能是随机/散列/其他类型的唯一文件名。这就是例如jupyter中的%% cython magic。

In [94]: import cython

In [95]: %load_ext cython

In [96]: %%cython
    ...: def f(a, b):
    ...:     return a + b
# generates ~/.ipython/cython/_cython_magic_5a675eece0e27eef1233e0a3e4d811e5.cp36-win_amd64.pyd

也可以看一下numba - 它对于动态生成来说肯定更方便。

答案 1 :(得分:0)

您还可以使用pyximport

import pyximport; pyximport.install()
Out[13]: (None, <pyximport.pyximport.PyxImporter at 0x101c7c650>)

import computeIt

仅在代码更改后:

reload(computeIt)