我正在维护一个包含许多实用程序函数的内部python包。作为此包的一部分,我包含了一个项目生成器console_script
,它使用随包附带的自定义模板调用cookiecutter。使用pip
(基本上作为sdist)安装软件包时,这可以正常工作。
我正在尝试让人们尽可能多地使用conda
,因此使用pip
而不是conda
来解析/安装依赖项会带来不便。因此,我正在使用Anaconda安装中包含的python setup.py bdist_conda
方式创建一个conda包。对于另一个内部包,这非常有效。
但是,当我尝试创建当前包时,bdist_conda
创建字节编译包中的所有python文件,当然(但无意)也是模板文件。在运行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
我也可以使用普通python setup.py bdist
进行复制,因此我可以将conda排除在罪魁祸首之外。
我在基于setuptools的MANIFEST.in
中添加了recursive-include mypkg/project_template *
包含include_package_data = True
和setup.py
的模板文件。
是否有(更好的)方法来运送带有某些包的cookiecutter模板?正如我所说的,当与pip
/ sdist一起使用时,这很有效,但与bdist
失败。
或者,有没有办法抑制bdist字节编译给定的文件集?
模板无法在线放置,这就是我想将其包含在包中的原因。 我还考虑将模板单独放在别处,但是用户在使用项目生成器时依赖于该位置(例如网络驱动器)。 我看着将它添加为zip文件,但除了从版本控制的角度来看,超级不方便apparently之外,用户将被提示删除现有的(我猜是解压缩到某个用户位置)模板下一次运行,所以我宁愿避免这种情况。
编辑:我也发布了这个in the cookiecutter issue tracker,但到目前为止没有得到任何反馈。
答案 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。