代码之家  ›  专栏  ›  技术社区  ›  Christoph

如何将cookiecutter模板包含在bdist/conda包中?

  •  0
  • Christoph  · 技术社区  · 7 年前

    我正在维护一个包含许多实用函数的内部python包。作为这个包的一部分,我包含了一个项目生成器 console_script 它使用包附带的自定义模板调用cookiecutter。当使用安装包时,这可以正常工作 pip (基本上,作为sdist)。

    我想让人们使用 conda 尽可能多,因此这很不方便,因为使用 pip公司 康达 . 因此,我正在使用 python setup.py bdist_conda Anaconda安装中包含的方式。afaict,这对于另一个内部包很有效。

    然而,当我尝试创建当前包时 bdist_conda creation byte编译包中的所有python文件,当然也编译模板文件。这会导致在运行时由于jinja字符串而出现语法错误 python设置。py bdist\u conda公司 :

      byte-compiling build/bdist.linux-x86_64/dumb/home/bilderbuchi/anaconda3/lib/python3.5/site-packages/mypkg/project_template/{{cookiecutter.project_name_simplified}}/{{cookiecutter.project_name_simplified}}.py to {{cookiecutter.project_name_simplified}}.cpython-35.pyc
      File "/path/to/mypkg/project_template/{{cookiecutter.project_name_simplified}}/{{cookiecutter.project_name_simplified}}.py", line 4
        {%- if cookiecutter.command_line_interface == 'argparse' %}
         ^
    SyntaxError: invalid syntax
    

    我也可以用普通的 python setup.py bdist 所以我可以排除康达是罪魁祸首。 我使用 MANIFEST.in 包含 recursive-include mypkg/project_template * include_package_data = True 在基于setuptools的 setup.py .

    有没有(更好的)方法将cookiecutter模板与一些包一起提供?正如我所说,当与 pip公司 /sdist,但失败 bdist . 或者,是否有方法禁止编译给定文件集的bdist字节?

    模板无法联机,这就是为什么我想将其包含在包中。 我还考虑将模板单独放置在其他位置,但用户在使用project generator时依赖于该位置(例如网络驱动器)。 我考虑将其添加为zip文件,但从版本控制的角度来看,除了这一点非常不方便之外, apparently ,用户将在下次运行时被提示删除现有模板(我猜已解压缩到某个用户位置),因此我宁愿避免这样做。

    • Cookiecutter版本:1.6.0
    • Python版本:3.5
    • 设置工具38.5.1
    • 操作系统:Linux

    编辑:我也发布了这个 in the cookiecutter issue tracker ,但到目前为止没有得到任何反馈。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Christoph    7 年前

    因此,在一次毫无结果的搜索之后,我通过更改所有 .py 模板文件到 .pytemplate . 这样可以避免b列表/b列表\u conda发现它们。我添加了一个post\u gen脚本,将所有文件重命名回 .py公司 从模板创建项目后。愚蠢的变通方法,但它有效:叹气:

    我知道,至少对于bdist,可以通过设置 sys.dont_write_bytecode ,但此解决方法不适用于 bdist_conda 看见 https://github.com/conda/conda-build/issues/686 .