为了账号安全,请及时绑定邮箱和手机立即绑定

如何 cythonize 全局 __builtin__ 对象?

如何 cythonize 全局 __builtin__ 对象?

达令说 2022-06-14 17:27:27
我有一个问题“cythonizing”用python编写的项目。1. python 类(在文件myclass.py中声明)被实例化,然后在文件main.py中使用 setattr(__builtin__...) “声明为全局”2. 在模块中声明的函数(文件module.py)访问它类实例的全局名称(“globalclass”),并设置一些值。所以问题是:如何通过在模块外部使用 setattr(__builtin__...) 定义的“全局名称”引用对象实例的 python 模块?我在 Windows x86 上使用 Cython 0.29.1 运行 python 2.7.15。当我运行纯 python 时,下面提供的代码可以正常工作:python main.py但是对文件module.py进行 cythonizing会给我一个错误:未声明的名称不是内置的,指的是类实例“globalclass”的全局名称。这是文件myclass.pyx,类的定义:class Myclass:    def __init__(self):        self.value = ''    def setValue(self,text):        self.value = text    def printValue(self):        print self.value这是文件module.pyx:这是我想要 cythonize 的文件,但 cython 说未声明的名称不是内置的“globalclass”:def setValue():    globalclass.setValue('test from module.py')这是实例化类的文件main.py(入口点),并使用 setattr(__builtin__...) “声明为全局”:import __builtin__from myclass import Myclassfrom module import setValueif __name__ == '__main__':    myclass = Myclass()    setattr(__builtin__, 'globalclass', myclass)    setValue()    globalclass.printValue()这是用于对所有内容进行cythonize的文件setup.py :from distutils.core import setupfrom Cython.Build import cythonizefrom distutils.extension import Extensioncyextensions = [    Extension(name='myclass', sources=['myclass.pyx']),    Extension(name='module', sources=['module.pyx']),    ]setup(name='test',      version = '0.0.1',      description = 'test',      packages = ['test'],      ext_modules = cythonize(cyextensions))这是我用来 cythonize 的命令:python setup.py build_ext --inplace这是我在 cythonizing 时收到的错误消息:Error compiling Cython file:------------------------------------------------------------...def setValue():        globalclass.setValue('test from module.py')^------------------------------------------------------------module.pyx:2:1: undeclared name not builtin: globalclass
查看完整描述

2 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

这是 Cython 与 Python 不同的地方(尽管没有很好地记录它)。本质上,它假定它应该能够在编译时解析所有全局名称,而您所做的事情会在运行时影响它。


幸运的是,有一个选项可以关闭此行为。只需在 setup.py 中添加两行(如上面的文档所示)


from Cython.Compiler import Options

Options.error_on_unknown_names = False


查看完整回答
反对 回复 2022-06-14
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

cython 编译器在运行时获取有关 python 内置函数的信息。
因此,在编译之前/同时修改“内置”将解决问题而无需采取进一步行动。
即在编译步骤中使用sitecustomize、usercustomize 或一些'yourname'.pth 来'import my_builtin_patching_module'。确保导入将采用您的原始 .py,而不是编译后的,否则导入的 .pyd/.so 可能会被锁定,从而阻止编译器输出。

查看完整回答
反对 回复 2022-06-14
  • 2 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信