如何在setup.py python脚本

时间:2015-12-03 15:40:53

标签: python gettext distutils setup.py po

考虑一个具有多语言支持的python包(使用gettext)。如何在执行*.po时动态将*.mo文件编译为setup.py个文件?我真的不想分发预编译的*.mo文件。

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
from distutils.core import setup

setup(
    name='tractorbeam',
    version='0.1.0',
    url='http://starfleet.org/tractorbeam/',
    description='Pull beer out of the fridge while sitting on the couch.',

    author='James T. Kirk',
    author_email= 'jkirk@starfleet.org',

    packages=['tractorbeam'],
    package_data={
        'tractorbeam': [
            'locale/*.po',
            'locale/*.mo',  # How to compile on the fly?
        ]
    },

    install_requires=[
        'requests'
    ]
)

提前致谢!

1 个答案:

答案 0 :(得分:3)

我知道这个问题开始有点老了,但是如果有人还在寻找答案:可以向setup.py添加一个能编译po文件的函数返回data_files list。我没有选择将它们包含在package_data中,因为data_files的说明看起来更合适:

  

配置文件,消息目录,数据文件,以及不适合以前类别的任何内容。

当然,您只能将此列表附加到您已使用的列表中,但假设您只在data_files中添加了这些mo文件,您可以写:

setup(
    .
    .
    .
    data_files=create_mo_files(),
    .
    .
    .
)

有关您的信息,请参阅我使用的create_mo_files()函数。我不会假装它是最好的实施方式。我把它放在这里是因为它看起来很有用并且很容易适应。请注意,它比您需要的更加复杂,因为它并不假设每个目录只编译一个po文件,而是处理几个;另请注意,它假设所有po文件都位于locale/language/LC_MESSAGES/*.po之类的内容中,您必须根据自己的需要进行更改:

def create_mo_files():
    data_files = []
    localedir = 'relative/path/to/locale'
    po_dirs = [localedir + '/' + l + '/LC_MESSAGES/'
               for l in next(os.walk(localedir))[1]]
    for d in po_dirs:
        mo_files = []
        po_files = [f
                    for f in next(os.walk(d))[2]
                    if os.path.splitext(f)[1] == '.po']
        for po_file in po_files:
            filename, extension = os.path.splitext(po_file)
            mo_file = filename + '.mo'
            msgfmt_cmd = 'msgfmt {} -o {}'.format(d + po_file, d + mo_file)
            subprocess.call(msgfmt_cmd, shell=True)
            mo_files.append(d + mo_file)
        data_files.append((d, mo_files))
    return data_files

(您必须导入ossubprocess才能使用它)