0

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

我试图让人们conda尽可能多地使用,所以这很不方便,因为依赖项得到解决/安装使用pip,而不是conda. 因此,我正在使用python setup.py bdist_condaAnaconda 安装包含的方式创建一个 conda 包。这适用于另一个内部包。

但是,当我尝试创建当前包时,bdist_conda创建字节编译包中的所有 python 文件,所以当然(但不是有意的)模板文件也是如此。由于 jinja 字符串,这会在运行时导致语法错误python setup.py bdist_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

我也可以用 plain 复制python setup.py bdist,所以我可以排除 conda 成为这里的罪魁祸首。我在基于MANIFEST.insetuptoolsrecursive-include mypkg/project_template *的.include_package_data = Truesetup.py

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

模板不能放在网上,所以我想把它包含在包里。我还考虑将模板单独放置在其他地方,但是用户在使用项目生成器时依赖于可用的位置(例如网络驱动器)。我考虑将其添加为 zip 文件,但除了从版本控制的角度来看这非常不方便外,显然,用户将被提示在下次运行时删除现有的(我猜解压到某个用户位置)模板,所以我宁愿避免这种情况。

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

编辑:我也在cookiecutter 问题跟踪器中发布了这个,但到目前为止没有得到任何反馈。

4

1 回答 1

0

因此,经过毫无结果的搜索,我通过将所有.py模板文件更改为.pytemplate. 这避免了 bdist/bdist_conda 发现它们。我添加了一个 post_gen 脚本,它将所有文件重命名为.py从模板创建项目后的名称。愚蠢的解决方法,但它有效。:叹:

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

于 2018-03-12T19:52:36.333 回答