Программное извлечение сообщений с помощью PyBabel

Прямо сейчас я извлекаю сообщения, используя

pybabel extract -F babel.cfg -o messages.pot .

Это просматривает все мои файлы Python и правильно извлекает сообщения. Однако я называю это через subprocess.call(), что довольно некрасиво, учитывая, что PyBbel также написан на Python.

Я заглянул в PyBabel, и он использует команды setuptools для выполнения своей работы. Я мог бы скопировать метод extract_messages.run() в свой скрипт Python, но он не выглядит слишком элегантным. Есть ли лучший способ сделать это? Есть тонны статей о том, как создавать новые команды setuptools, но никто не пишет о том, как их вызывать…


person GergelyPolonkai    schedule 03.08.2017    source источник


Ответы (2)


Возможно, это то, что вы ищете: Как мне запустить команду python 'sdist' из автоматизированного скрипта python без использования подпроцесса?

Я собираюсь показать несколько вариантов запуска кода 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 и фактически вызывать код Python CommandInterface из Babel.

Это мой любимый способ назвать это:

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, и оно не вызывает новый процесс.

Удачи

person Emilio    schedule 28.05.2019

Я использую 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')

Надеюсь, это даст вам представление

person Jonathan Arias    schedule 01.06.2018
comment
Это именно то, чего я пытаюсь избежать. Зачем вызывать скрипт Python из Python через os.system? Кроме того, это то, что я делаю сейчас. - person GergelyPolonkai; 01.06.2018