使用gettext进行Cython

时间:2012-08-13 04:58:11

标签: python gettext cython

我开始使用Cython,并遇到在源文件中使用gettext转换的问题。作为一个例子,我有一个名为 ScriptParser.py 的源文件,我正在测试它编译为.pyd对象。这根本没有修改源代码,只是试图让文件在此刻编译。此文件是从项目中的一个主文件导入的。该主文件还导入不同的源文件,该文件使用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 个答案:

答案 0 :(得分:1)

我认为你做错了什么。只是gettext修改了__builtin__命名空间,而cython无法知道。作为一种解决方法,您只需为发生这种情况的所有文件添加:

import __builtin__; _ = __builtin__._

我不知道你怎么会告诉cython接受__builtin__范围内非标准变量的存在,但也许你可以询问cython邮件列表是否还有另一种方法来欺骗cython 。 (请注意,如果在导入模块之前没有完成gettext内容,这也会失败。虽然添加try: ... except: ...子句将__builtin__._设置为None但是如果它不存在则会修复它。 / p>

编辑:当然_当然是在模块范围内,但我不认为这应该是一个问题。

相关问题