我有各自的函数(来自用户输入)用于绘图(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失败
我认为解释器持有模块而我无法访问它但我不知道这是否正确。我还尝试取消链接文件。
有什么建议可以解决这个问题吗?
答案 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)