如何在 setup.py 中执行(安全的)bash shell 命令?
How to execute a (safe) bash shell command within setup.py?
我使用 nunjucks 在 python 项目中对前端进行模板化。 Nunjucks 模板 必须 在生产中预编译。我不在 nunjucks 模板中使用扩展或异步过滤器。与其使用 grunt-task 来监听模板的变化,我更喜欢使用 nunjucks-precompile 命令(通过 npm 提供)将整个模板目录扫入 templates.js。
我的想法是让 nunjucks-precompile --include ["\.tmpl$"] path/to/templates > templates.js
命令在 setup.py 内执行,这样我就可以简单地搭载部署程序脚本的常规执行。
我发现 a setuptools override and a distutils scripts argument 可能会达到正确的目的,但我不确定这是否是最简单的执行方法。
另一种方法是使用 subprocess
直接在 setup.py 中执行命令,但有人警告我不要这样做(恕我直言,先发制人)。我不是很理解为什么不。
有什么想法吗?肯定?确认?
更新 (04/2015): - 如果您没有可用的 nunjucks-precompile
命令,只需使用 Node Package Manager 像这样安装 nunjucks:
$ npm install nunjucks
请原谅我的快速自我回答。我希望这可以帮助以太中的某个人。既然我已经找到了一个令我满意的解决方案,我想分享一下。
这是一个基于 Peter Lamut's write-up 的安全解决方案。请注意,这 not 在子进程调用中使用 shell=True。您可以绕过 python 部署系统上的 grunt-task 要求,也可以将其用于混淆和 JS 打包。
from setuptools import setup
from setuptools.command.install import install
import subprocess
import os
class CustomInstallCommand(install):
"""Custom install setup to help run shell commands (outside shell) before installation"""
def run(self):
dir_path = os.path.dirname(os.path.realpath(__file__))
template_path = os.path.join(dir_path, 'src/path/to/templates')
templatejs_path = os.path.join(dir_path, 'src/path/to/templates.js')
templatejs = subprocess.check_output([
'nunjucks-precompile',
'--include',
'["\.tmpl$"]',
template_path
])
f = open(templatejs_path, 'w')
f.write(templatejs)
f.close()
install.run(self)
setup(cmdclass={'install': CustomInstallCommand},
...
)
我认为 link here 概括了您要实现的目标。
我使用 nunjucks 在 python 项目中对前端进行模板化。 Nunjucks 模板 必须 在生产中预编译。我不在 nunjucks 模板中使用扩展或异步过滤器。与其使用 grunt-task 来监听模板的变化,我更喜欢使用 nunjucks-precompile 命令(通过 npm 提供)将整个模板目录扫入 templates.js。
我的想法是让 nunjucks-precompile --include ["\.tmpl$"] path/to/templates > templates.js
命令在 setup.py 内执行,这样我就可以简单地搭载部署程序脚本的常规执行。
我发现 a setuptools override and a distutils scripts argument 可能会达到正确的目的,但我不确定这是否是最简单的执行方法。
另一种方法是使用 subprocess
直接在 setup.py 中执行命令,但有人警告我不要这样做(恕我直言,先发制人)。我不是很理解为什么不。
有什么想法吗?肯定?确认?
更新 (04/2015): - 如果您没有可用的 nunjucks-precompile
命令,只需使用 Node Package Manager 像这样安装 nunjucks:
$ npm install nunjucks
请原谅我的快速自我回答。我希望这可以帮助以太中的某个人。既然我已经找到了一个令我满意的解决方案,我想分享一下。
这是一个基于 Peter Lamut's write-up 的安全解决方案。请注意,这 not 在子进程调用中使用 shell=True。您可以绕过 python 部署系统上的 grunt-task 要求,也可以将其用于混淆和 JS 打包。
from setuptools import setup
from setuptools.command.install import install
import subprocess
import os
class CustomInstallCommand(install):
"""Custom install setup to help run shell commands (outside shell) before installation"""
def run(self):
dir_path = os.path.dirname(os.path.realpath(__file__))
template_path = os.path.join(dir_path, 'src/path/to/templates')
templatejs_path = os.path.join(dir_path, 'src/path/to/templates.js')
templatejs = subprocess.check_output([
'nunjucks-precompile',
'--include',
'["\.tmpl$"]',
template_path
])
f = open(templatejs_path, 'w')
f.write(templatejs)
f.close()
install.run(self)
setup(cmdclass={'install': CustomInstallCommand},
...
)
我认为 link here 概括了您要实现的目标。