Cython无法导入和执行函数:存储临时Python参考的不安全C派生

非对称

我是Cython的新手,只是尝试尝试一个简单的脚本。我无法从模块中导入函数并在另一个文件中使用它,但是如果我在同一文件中声明该函数,则效果很好。这可能是问题所在。我想念什么吗?

这是原始代码段(test_cy.pyx):

# test_cy.pyx

import json

cpdef char* say_hello():
  message = json.dumps({"message": "Hello world"})
  return message.encode()

cdef char* fn(int n):
  cdef char* hello = say_hello()
  return hello

def test():
  cdef char* n = fn(1000)
  print(n)

我可以这样运行(编译后):

>>> import test_cy
>>> test_cy.test()
b'Hello world'

但是,如果我将say_hello函数移到另一个文件(utils.pyx):

# utils.pyx

import json

cpdef char* say_hello():
  message = json.dumps({"message": "Hello world"})
  return message.encode()

...并将其导入我的原始test_cy.pyx文件中,如下所示:

# test_cy.pyx

from utils import say_hello

cdef char* fn(int n):
  cdef char* hello = say_hello()
  return hello

def test():
  cdef char* n = fn(1000)
  print(n)

我收到以下错误,无法编译它:

>>> python3 setup.py build_ext --inplace
...
Error compiling Cython file:
------------------------------------------------------------
...
from utils import say_hello

cdef char* fn(int n):
  cdef char* hello = say_hello()
      ^
------------------------------------------------------------

test_cy.pyx:4:7: Storing unsafe C derivative of temporary Python reference
Traceback (most recent call last):
  File "setup.py", line 11, in <module>
    sources=["utils.pyx"]
  File "/Users/asim/.pyenv/versions/3.6.9/lib/python3.6/site-packages/Cython/Build/Dependencies.py", line 1101, in cythonize
    cythonize_one(*args)
  File "/Users/asim/.pyenv/versions/3.6.9/lib/python3.6/site-packages/Cython/Build/Dependencies.py", line 1224, in cythonize_one
    raise CompileError(None, pyx_file)
Cython.Compiler.Errors.CompileError: test_cy.pyx

这是我的setup.py文件:

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

setup(
  ext_modules = cythonize([
    Extension("test_cy",
              sources=["test_cy.pyx"]
    ),
    Extension("utils",
              sources=["utils.pyx"]
    )
  ])
)

请帮助我,因为它很简单,例如从另一个模块导入函数,应该不会那么复杂。我可能缺少一些琐碎的东西。谢谢!

戴维
cpdef char* say_hello():
  message = json.dumps({"message": "Hello world"})
  return message.encode()

这是一场等待发生的灾难(尽管Cython似乎无法发出警告)。char*指向的数据message.encode()-临时Python对象的结果保存,该对象在创建后即被销毁。因此,您char*立即无效。

考虑一下用C表示的话:要返回char*某人,必须拥有,char*并且您应该确切知道该所有者是谁。没有一种简单,明智的方法来返回a,char*而无需负责分配/取消分配您自己。除非您准备这样做并了解如何做,否则我建议您char*从代码中删除所有代码,然后返回Python对象。


您收到的错误特别是因为Cython用来cimport了解Cython函数。

from utils cimport say_hello

没有cimport它,相信这say_hello只是返回普通Python对象的普通Python函数。但是,即使进行了此更改,您的代码仍然无效-您已将错误移到了Cython无法看到的地方。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

即使输入了函数,我在导入的函数上也遇到了“不安全调用”和“不安全分配”错误

来自分类Dev

Swift:无法在数组中存储不安全指针

来自分类Dev

Swift:无法在数组中存储不安全指针

来自分类Dev

C ++-'localtime'此函数或变量可能不安全

来自分类Dev

不安全的IO或:Haskeline和目录

来自分类Dev

Swift:gettimeofday和不安全指针

来自分类Dev

将派生对象存储到void *,然后将基础对象强制转换为void *是不安全的吗?

来自分类Dev

泊坞窗组成,无所事事和不安全的存储库

来自分类Dev

C ++不安全的强制转换方法

来自分类Dev

编译C#不安全代码

来自分类Dev

C#中的不安全结构

来自分类Dev

删除C#不安全指针

来自分类Dev

Python FTP服务器:如何同时支持安全和不安全

来自分类Dev

SameSite = none和不安全的HTTP Cookie无法在Chrome上运行

来自分类Dev

错误C4996:'scanf':该函数或变量在C编程中可能不安全

来自分类Dev

这个不安全的 C++ 代码在 Python 中安全吗?

来自分类Dev

C ++的默认复制构造函数本质上是不安全的吗?迭代器从根本上来说也不安全吗?

来自分类Dev

不安全的浏览

来自分类Dev

不安全的BasicHttpBinding

来自分类Dev

无法在单个Oauth安全的Spring控制器中拥有安全和不安全的端点

来自分类Dev

为什么C11标准不会丢弃不安全的strcat(),strcpy()函数?

来自分类Dev

错误C4996:'std :: _ Copy_impl':函数调用的参数可能不安全

来自分类Dev

安全和不安全下调的示例?

来自分类Dev

安全和不安全下调的示例?

来自分类Dev

不安全的C#-将不安全的指针传递给方法

来自分类Dev

通过HTTP URL执行代码是否不安全?

来自分类Dev

来自iframge的Firefox本地存储-SecurityError:操作不安全

来自分类Dev

C#性能-使用不安全的指针代替IntPtr和Marshal

来自分类Dev

C#性能-使用不安全的指针代替IntPtr和Marshal

Related 相关文章

  1. 1

    即使输入了函数,我在导入的函数上也遇到了“不安全调用”和“不安全分配”错误

  2. 2

    Swift:无法在数组中存储不安全指针

  3. 3

    Swift:无法在数组中存储不安全指针

  4. 4

    C ++-'localtime'此函数或变量可能不安全

  5. 5

    不安全的IO或:Haskeline和目录

  6. 6

    Swift:gettimeofday和不安全指针

  7. 7

    将派生对象存储到void *,然后将基础对象强制转换为void *是不安全的吗?

  8. 8

    泊坞窗组成,无所事事和不安全的存储库

  9. 9

    C ++不安全的强制转换方法

  10. 10

    编译C#不安全代码

  11. 11

    C#中的不安全结构

  12. 12

    删除C#不安全指针

  13. 13

    Python FTP服务器:如何同时支持安全和不安全

  14. 14

    SameSite = none和不安全的HTTP Cookie无法在Chrome上运行

  15. 15

    错误C4996:'scanf':该函数或变量在C编程中可能不安全

  16. 16

    这个不安全的 C++ 代码在 Python 中安全吗?

  17. 17

    C ++的默认复制构造函数本质上是不安全的吗?迭代器从根本上来说也不安全吗?

  18. 18

    不安全的浏览

  19. 19

    不安全的BasicHttpBinding

  20. 20

    无法在单个Oauth安全的Spring控制器中拥有安全和不安全的端点

  21. 21

    为什么C11标准不会丢弃不安全的strcat(),strcpy()函数?

  22. 22

    错误C4996:'std :: _ Copy_impl':函数调用的参数可能不安全

  23. 23

    安全和不安全下调的示例?

  24. 24

    安全和不安全下调的示例?

  25. 25

    不安全的C#-将不安全的指针传递给方法

  26. 26

    通过HTTP URL执行代码是否不安全?

  27. 27

    来自iframge的Firefox本地存储-SecurityError:操作不安全

  28. 28

    C#性能-使用不安全的指针代替IntPtr和Marshal

  29. 29

    C#性能-使用不安全的指针代替IntPtr和Marshal

热门标签

归档