如何在Python脚本中调用Tools/i18n中的msgfmt.py、pygettext工具?
在Python脚本中调用Python工具的最佳实践
优先选择「导入模块+调用主函数」,而非系统命令
像msgfmt.py和pygettext这类官方工具本质是可执行Python脚本,核心逻辑都封装在代码里。直接导入并调用它们的主函数,是跨平台最可靠的方案,能避开PATH配置、系统解释器差异这些坑。
1. 直接导入工具模块调用
这类工具通常会在脚本末尾用if __name__ == '__main__':触发主逻辑,你可以手动导入模块,模拟命令行参数后调用主函数:
示例:调用pygettext
import sys # 把Tools/i18n的路径添加到Python搜索路径,根据实际位置调整 sys.path.append("/path/to/python/Tools/i18n") import pygettext # 模拟命令行参数,比如指定域和待扫描的源码文件 sys.argv = ['pygettext', '-d', 'myapp', 'src/*.py'] pygettext.main()
示例:调用msgfmt.py
import sys sys.path.append("/path/to/python/Tools/i18n") import msgfmt # 模拟命令行参数,指定输入po文件和输出mo文件 sys.argv = ['msgfmt', '-o', 'myapp.mo', 'myapp.po'] msgfmt.main()
2. 处理工具仅存在于系统Python的情况
如果工具没装在当前venv里,有两种稳妥方案:
- 指定系统Python解释器调用脚本:用
subprocess(比os.system更安全可控)直接调用系统Python执行工具脚本,跨平台都适用:
import subprocess # Windows下示例,替换成你的系统Python路径 system_python = "C:/Python39/python.exe" tools_path = "C:/Python39/Tools/i18n/" # 执行pygettext subprocess.run([system_python, f"{tools_path}pygettext.py", "-d", "myapp", "src/*.py"]) # 执行msgfmt subprocess.run([system_python, f"{tools_path}msgfmt.py", "-o", "myapp.mo", "myapp.po"])
Linux下同理,把路径换成/usr/bin/python3和对应的/usr/lib/pythonX.X/Tools/i18n/即可。
- 复制工具脚本到项目目录:如果系统Python和当前venv版本兼容,直接把
msgfmt.py和pygettext复制到项目的工具目录下,就能直接导入调用,彻底摆脱对系统环境的依赖。
3. 为什么不推荐os.system?
os.system很难捕获命令的输出和错误信息,跨平台时命令格式差异大(比如Windows的路径分隔符、解释器调用方式)。用subprocess.run()能精准控制输入输出、获取返回码,代码也更易维护。
内容的提问来源于stack exchange,提问作者MaKaNu
相关产品推荐
相关产品推荐

