2

Cython を使い始めたばかりですが、ソース ファイルで gettext 翻訳を使用すると問題が発生します。例として、.pyd オブジェクトへのコンパイルをテストしているScriptParser.pyというソース ファイルがあります。これは、ソースをまったく変更せずに、現時点でファイルをコンパイルしようとしているだけです。このファイルは、プロジェクトのメイン ファイルの 1 つからインポートされます。そのメイン ファイルは、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 は明らかに不平を言っています。では、どうすればこの問題を解決できるのだろうかと考えています。ビルド スクリプトを変更して、より多くのファイルを含める必要がありますか? 現在、私は一度に 1 つのファイルをコンパイルして、奇妙な点などをテストしようとしています。この問題に遭遇したとき、私はすでにこの方法で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 つのソース ファイルをコンパイルしようとしているのかもしれません。

4

1 に答える 1

1

あなたが何か間違ったことをしているとは思いません。__builtin__cython が認識できない名前空間をgettext が変更するだけです。回避策として、これが発生するすべてのファイルに次を追加できます。

import __builtin__; _ = __builtin__._

スコープ内の非標準変数の存在を受け入れるように cython に指示する他の方法はわかりませんが__builtin__、cython をだます別の方法があるかどうか、cython メーリング リストに問い合わせることができるかもしれません。(モジュールのインポート前に gettext が実行されていない場合、これも失敗することに注意してください。ただし、まだ存在しない場合に Nonetry: ... except: ...に設定する句を追加すると、それが修正されます。__builtin__._

EDIT:もちろん_、ここではモジュールスコープですが、これは問題になるとは思いません。

于 2012-08-21T14:06:29.787 に答える