对于图(x^2,e^x,x,.),我有单独的函数(来自用户输入)我会在cython中计算坐标。我已经用Python代码与exec一起创建了一个单独的函数,但这对我来说太慢了。
我试图生成单独的.pyx文件,并将它们编译成.pyd文件(在Windows上)。
这是我生成单个.pyx文件并编译它们的方法。生成工作正常,但只有在没有从主脚本中的.pyd文件导入cython模块时才能编译它们。如果我编译它,然后在我的主类中导入模块,它可以正常工作,但是一旦导入,我就不能再编译它了。(该文件用于测试,no 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 filesetup.py文件以编译.pyx:
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules = cythonize("evalTest.pyx")
)此外,我试图将它编译成一个临时文件,并将.pyd文件替换为原子操作,但随后我得到了一个“拒绝权限”错误(如果我以admin身份运行脚本)。
如果我首先导入cython模块,然后尝试重新编译它,我得到:
链接:致命错误LNK1104:无法打开文件LNK1104 错误:命令C:\Program (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.11.25503\bin\HostX86\x64\link.exe‘失败,退出状态为1104
我认为解释器持有模块,我无法访问它,但我不知道这是否正确。我还试着解除文件的链接。
有什么解决这个问题的建议吗?
发布于 2018-03-12 17:51:39
您是正确的,翻译正在坚持pyd。据我所知,在运行的python解释器中卸载c扩展模块实际上是不可能的。
处理这个问题的最好方法可能是随机/散列/其他类型的唯一文件名。例如,jupyter中%%cython魔术就是这样做的。
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或许还可以看看南巴 --当然,这对正在运行的一代来说更方便。
发布于 2018-09-07 19:52:06
您也可以使用pyximport
import pyximport; pyximport.install()
Out[13]: (None, <pyximport.pyximport.PyxImporter at 0x101c7c650>)
import computeIt代码更改后,只需:
reload(computeIt)https://stackoverflow.com/questions/49239036
复制相似问题