【问题标题】:Cython with gettext带有 gettext 的 Cython
【发布时间】:2012-08-21 22:06:29
【问题描述】:

我开始使用 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。所以也许我错误地试图一次编译一个源文件,而不是做一些“项目作为一个整体”的方法?

【问题讨论】:

    标签: python gettext cython


    【解决方案1】:

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

    import __builtin__; _ = __builtin__._
    

    我不知道您会如何告诉 cython 接受在 __builtin__ 范围内存在的非标准变量,但也许您可以询问 cython 邮件列表是否有其他方法可以欺骗 cython。 (请注意,如果在导入模块之前未完成 gettext 内容,这也会失败。尽管添加 try: ... except: ... 子句以将 __builtin__._ 设置为 None 如果它尚不存在将解决此问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-22
      • 1970-01-01
      相关资源
      最近更新 更多