第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何 cythonize 全局 __builtin__ 對象?

如何 cythonize 全局 __builtin__ 對象?

達令說 2022-06-14 17:27:27
我有一個問題“cythonizing”用python編寫的項目。1. python 類(在文件myclass.py中聲明)被實例化,然后在文件main.py中使用 setattr(__builtin__...) “聲明為全局”2. 在模塊中聲明的函數(shù)(文件module.py)訪問它類實例的全局名稱(“globalclass”),并設(shè)置一些值。所以問題是:如何通過在模塊外部使用 setattr(__builtin__...) 定義的“全局名稱”引用對象實例的 python 模塊?我在 Windows x86 上使用 Cython 0.29.1 運行 python 2.7.15。當(dāng)我運行純 python 時,下面提供的代碼可以正常工作:python main.py但是對文件module.py進行 cythonizing會給我一個錯誤:未聲明的名稱不是內(nèi)置的,指的是類實例“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 說未聲明的名稱不是內(nèi)置的“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()這是用于對所有內(nèi)容進行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 回答

?
呼啦一陣風(fēng)

TA貢獻1802條經(jīng)驗 獲得超6個贊

這是 Cython 與 Python 不同的地方(盡管沒有很好地記錄它)。本質(zhì)上,它假定它應(yīng)該能夠在編譯時解析所有全局名稱,而您所做的事情會在運行時影響它。


幸運的是,有一個選項可以關(guān)閉此行為。只需在 setup.py 中添加兩行(如上面的文檔所示)


from Cython.Compiler import Options

Options.error_on_unknown_names = False


查看完整回答
反對 回復(fù) 2022-06-14
?
紫衣仙女

TA貢獻1839條經(jīng)驗 獲得超15個贊

cython 編譯器在運行時獲取有關(guān) python 內(nèi)置函數(shù)的信息。
因此,在編譯之前/同時修改“內(nèi)置”將解決問題而無需采取進一步行動。
即在編譯步驟中使用sitecustomize、usercustomize 或一些'yourname'.pth 來'import my_builtin_patching_module'。確保導(dǎo)入將采用您的原始 .py,而不是編譯后的,否則導(dǎo)入的 .pyd/.so 可能會被鎖定,從而阻止編譯器輸出。

查看完整回答
反對 回復(fù) 2022-06-14
  • 2 回答
  • 0 關(guān)注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號