首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态动态编译

动态动态编译
EN

Stack Overflow用户
提问于 2018-03-12 15:34:29
回答 2查看 1.7K关注 0票数 0

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

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

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

我认为解释器持有模块,我无法访问它,但我不知道这是否正确。我还试着解除文件的链接。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-12 17:51:39

您是正确的,翻译正在坚持pyd。据我所知,在运行的python解释器中卸载c扩展模块实际上是不可能的。

处理这个问题的最好方法可能是随机/散列/其他类型的唯一文件名。例如,jupyter中%%cython魔术就是这样做的。

代码语言:javascript
复制
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

或许还可以看看南巴 --当然,这对正在运行的一代来说更方便。

票数 1
EN

Stack Overflow用户

发布于 2018-09-07 19:52:06

您也可以使用pyximport

代码语言:javascript
复制
import pyximport; pyximport.install()
Out[13]: (None, <pyximport.pyximport.PyxImporter at 0x101c7c650>)

import computeIt

代码更改后,只需:

代码语言:javascript
复制
reload(computeIt)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49239036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档