使用 PyBabel 以编程方式提取消息
Extract messages programmatically with PyBabel
现在,我正在使用
提取消息
pybabel extract -F babel.cfg -o messages.pot .
这遍历了我所有的 Python 文件并正确提取了消息。但是,我通过 subprocess.call()
调用它,这非常难看,因为 PyBbel 也是用 Python.
编写的
我查看了 PyBabel,它使用 setuptools 命令来完成它的工作。我可以将 extract_messages.run()
方法复制到我的 Python 脚本中,但感觉不太优雅。有更好的方法吗?关于如何创建新的 setuptools 命令的文章很多,但没有人写过如何调用它们……
我现在使用 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')
希望它能给你一个想法
也许这就是您要找的: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'])
这是最接近底层代码的代码,除非您想开始 copy/pasting 并自定义 python 代码。同样,这是 100% python 解决方案,它不会调用新进程。
祝你好运
现在,我正在使用
提取消息pybabel extract -F babel.cfg -o messages.pot .
这遍历了我所有的 Python 文件并正确提取了消息。但是,我通过 subprocess.call()
调用它,这非常难看,因为 PyBbel 也是用 Python.
我查看了 PyBabel,它使用 setuptools 命令来完成它的工作。我可以将 extract_messages.run()
方法复制到我的 Python 脚本中,但感觉不太优雅。有更好的方法吗?关于如何创建新的 setuptools 命令的文章很多,但没有人写过如何调用它们……
我现在使用 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')
希望它能给你一个想法
也许这就是您要找的: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'])
这是最接近底层代码的代码,除非您想开始 copy/pasting 并自定义 python 代码。同样,这是 100% python 解决方案,它不会调用新进程。
祝你好运