如何编写在python_binary上将标头代码添加到Python源代码的裤子构建插件

时间:2019-01-17 16:53:19

标签: python pants

我正在构建一个裤子插件,该插件应修改python_binary目标中“源”规范中的代码,以使标头中包含一些额外的代码。我不知道如何创建裤子/将裤子重定向到中间文件。

我这样做的原因是,据我所知,裤子构建不支持.pth文件的概念。我认为不支持它很好,但是我们正在从一个确实使用.pth的基于setuptools的项目中迁移到裤子构建,因此必须修改sys.path以支持正确的路径(将磁盘的实际路径固定为有问题的库是不可能的,因为第三方工具会为我们生成库的代码和布局。

给出下面的代码,MyPythonBinary尝试更改源代码以在文件的开头包括几行额外的代码。问题是“源”正在引用实际的源文件,但是我想写一个带有更改的中间文件,然后将“源”重定向到该中间文件。

我知道“ sources”是FilesetWithSpec的一种,但是想出如何正确创建它们的方法有点困难,因此我可以写一个不同的中间文件。有人可以帮我吗?

from pants.backend.python.targets.python_binary import PythonBinary
from six import string_types

import os

PATCH_CODE = """
import MyOtherLibrary
if os.path.dirname(MyOtherLibrary.__file__) not in sys.path:
    sys.path.append(os.path.dirname(MyOtherLibrary.__file__))
"""


class MyPythonBinary(PythonBinary):
    def __init__(self, *args, **kwargs):
        if 'sources' in kwargs:
            sources = kwargs['sources']
            assert len(sources.files) == 1,\
                "sources.files must contain a single file"

            # I know this is nasty.  I got it from debugging.
            source_file = sources.snapshot.path_stats[0].stat.path
            self._patch_source(source_file, PATCH_CODE)

            # recreate the filespec but pointing to an intermediate file
            # kwargs['sources'] = None
        super(MyPythonBinary, self).__init__(*args, **kwargs)

    def _patch_source(self, source_file, prepend=""):
        """
        Patches source code in C{source_file} with the contents of C{prepend},
        storing the results in a temporary source file.
        @type source_file: string_types
        @param source_file: path to the file containing the source code
        @type prepend: string_types
        @param prepend: Code to prepend
        """
        assert isinstance(source_file, string_types)
        assert isinstance(prepend, string_types)

        with open(source_file, 'w+') as fout:
            fout.seek(0)
            fout.write(prepend)

以上代码将PATCH_CODE中的代码添加到原始源文件中,而不是中间文件中。裤子不知道新的中间文件。

0 个答案:

没有答案