如何使用bdist / conda包包含cookiecutter模板?

时间:2018-03-07 16:20:55

标签: python setuptools cookiecutter

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

我正在尝试让人们尽可能多地使用conda,因此使用pip而不是conda来解析/安装依赖项会带来不便。因此,我正在使用Anaconda安装中包含的python setup.py bdist_conda方式创建一个conda包。对于另一个内部包,这非常有效。

但是,当我尝试创建当前包时,bdist_conda创建字节编译包中的所有python文件,当然(但无意)也是模板文件。在运行python setup.py bdist_conda

时,由于jinja字符串,这会导致语法错误
  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进行复制,因此我可以将conda排除在罪魁祸首之外。 我在基于setuptools的MANIFEST.in中添加了recursive-include mypkg/project_template *包含include_package_data = Truesetup.py的模板文件。

是否有(更好的)方法来运送带有某些包的cookiecutter模板?正如我所说的,当与pip / sdist一起使用时,这很有效,但与bdist失败。 或者,有没有办法抑制bdist字节编译给定的文件集?

模板无法在线放置,这就是我想将其包含在包中的原因。 我还考虑将模板单独放在别处,但是用户在使用项目生成器时依赖于该位置(例如网络驱动器)。 我看着将它添加为zip文件,但除了从版本控制的角度来看,超级不方便apparently之外,用户将被提示删除现有的(我猜是解压缩到某个用户位置)模板下一次运行,所以我宁愿避免这种情况。

  • Cookiecutter版本:1.6.0
  • Python版本:3.5
  • setuptools 38.5.1
  • 操作系统:Linux

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

1 个答案:

答案 0 :(得分:0)

因此,在搜索无效后,我将所有.py模板文件更改为.pytemplate,以避免此问题。这可以避免bdist / bdist_conda发现它们。我添加了一个post_gen脚本,在从模板创建项目后,将所有文件重命名为.py。愚蠢的解决方法,但它的工作原理。 :叹息:

我知道至少对于bdist,可以通过设置sys.dont_write_bytecode来避免编译,但bdist_conda无法使用此解决方法,请参阅https://github.com/conda/conda-build/issues/686