2012-08-13 41 views
2

我開始使用Cython,並遇到在源文件中使用gettext轉換的問題。作爲一個例子,我有一個名爲的源文件ScriptParser.py我正在測試編譯爲.pyd對象。這完全沒有修改源代碼,只是試圖讓文件在此刻編譯。該文件是從項目中的一個主文件導入的。該主文件還導入了一個不同的源文件,該文件使用gettext來安裝翻譯功能_()。用Cython是給我的錯誤是這樣的:使用gettext的Cython

Error compiling Cython file: 
------------------------------------------------------------ 
... 
      fn += u':%i' % step 

      fn += u']' 
      return eval(fn) 
     except: 
      error(_(u'IndexError')) 
       ^
------------------------------------------------------------ 

ScriptParser.py:416:19: undeclared name not builtin: _ 

顯然用Cython抱怨,因爲在這個源文件沒有在那裏是_()引用或定義或任何東西,或排序。所以我想知道我應該如何解決這個問題。我是否需要更改構建腳本以包含更多文件?現在我只是試圖編譯一個文件,以測試古怪等。當我遇到這個問題時,我已經以這種方式編譯了2個源文件。

這裏是我的構建腳本供參考:

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

setup(
    name = 'testing', 
    ext_modules = cythonize(['ScriptParser.py', 
           ], 
          annotate=True), 
    ) 

並與名爲:

setup.py build_ext --inplace

現在,就像我說我可能只是擰在構建過程中,這是我第一次進入Cython。所以也許我錯誤地試圖編譯一個源文件,而不是做一些「整個項目」的方法?

回答

1

我不認爲你做錯了什麼。只是gettext修改了cython無法知道的__builtin__命名空間。作爲一種變通方法,你可以只添加了這種情況出現的所有文件:

import __builtin__; _ = __builtin__._ 

我不知道你將如何去說吧用Cython接受的範圍__builtin__非標準變量是否存在等,但也許你可以詢問cython郵件列表是否有另一種方式欺騙cython。 (注意,如果在導入模塊之前gettext的東西沒有完成,這也會失敗,但是如果子句將__builtin__._設置爲None,如果它還不存在,將會修復該問題。這裏是在模塊範圍然後,但我不認爲這應該是一個問題。