【问题标题】:Extract messages programmatically with PyBabel使用 PyBabel 以编程方式提取消息
【发布时间】:2017-08-03 13:03:46
【问题描述】:

现在,我正在使用

提取消息
pybabel extract -F babel.cfg -o messages.pot .

这将遍历我的所有 Python 文件并正确提取消息。但是,我通过 subprocess.call() 调用它,这很丑陋,因为 PyBbel 也是用 Python 编写的。

我查看了 PyBabel,它使用 setuptools 命令来完成它的工作。我可以将extract_messages.run() 方法复制到我的Python 脚本中,但感觉不太优雅。有更好的方法吗?关于如何创建新的 setuptools 命令的文章有很多,但没有人写过如何调用它们……

【问题讨论】:

    标签: python setuptools python-babel


    【解决方案1】:

    也许这就是你要找的东西:How do i run the python 'sdist' command from within a python automated script without using subprocess?

    我将展示一些替代方案来运行 Babel Python 代码,而无需创建新的子进程,从更高级别到更低级别。

    这是一种黑客攻击,取自上面链接的答案:

    from setuptools.dist import Distribution
    from babel.messages.frontend import extract_messages
    
    dist = Distribution({'name': 'my-project', 'version': '1.0.0'}) # etc.
    dist.script_name = 'setup.py'
    cmd = extract_messages(dist)
    cmd.ensure_finalized()
    cmd.run()  # TODO: error handling
    

    pylabel 脚本实际上做了这样的事情:

    from babel.messages.frontend import main
    
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(main())
    

    但你可以避免通过 sys.argv 发送命令,而实际上是从 babel 调用 CommandInterface python 代码。

    这是我最喜欢的称呼方式:

    from babel.messages.frontend import CommandLineInterface
    
    CommandLineInterface().run(['pybabel','extract','-F','babel.cfg','-k','lazy_gettext','-o','messages.pot','sample_project'])
    CommandLineInterface().run(['pybabel','init','-i','messages.pot','-d','translations','-l','en'])
    CommandLineInterface().run(['pybabel','compile','-d','translations'])
    CommandLineInterface().run(['pybabel','update','-d','translations'])
    

    这是最接近低级代码的方法,除非您想开始复制/粘贴和自定义 python 代码。同样,这是一个 100% 的 Python 解决方案,它不会调用新进程。

    祝你好运

    【讨论】:

      【解决方案2】:

      我现在使用 os 来执行此脚本:

      #!venv/bin/python
      import os
      
      pybabel = 'venv/bin/pybabel'
      os.system(pybabel + ' extract -F babel.cfg -k lazy_gettext -o messages.pot app')
      os.system(pybabel + ' update -i messages.pot -d app/translations')
      os.unlink('messages.pot')
      

      希望能给你一个思路

      【讨论】:

      • 这正是我想要避免的。为什么要通过os.system 从 Python 调用 Python 脚本?另外,这就是我现在所做的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多