我看到一个Python脚本开始Python脚本中的%{__ python34}是什么?
#!%{__python34}
from __future__ import unicode_literals
# Whether we're Python 2
我猜__python34是用来获取python2或Python 3.4的路径,但它似乎不工作,作为输出的消息说,该文件不存在。 ..
谢谢。
我看到一个Python脚本开始Python脚本中的%{__ python34}是什么?
#!%{__python34}
from __future__ import unicode_literals
# Whether we're Python 2
我猜__python34是用来获取python2或Python 3.4的路径,但它似乎不工作,作为输出的消息说,该文件不存在。 ..
谢谢。
我相信这是被称为“模板”(%{var}
被用于例如通过使用RPM模板引擎我们可以看到in this example,看到.spec
文件特别)的技术。而很多这些模板引擎的存在,Jinja2,Mako等等等等(更详尽的清单,可以发现here)
现在让我们使用的Jinja2创建一个简单的例子,我们创建的第一件事情是一个模板(让我们把它放在一个templates
文件夹遵循惯例),我们称之为,python_script_tmpl:
#!{{ python }}
def main():
print("It works")
现在让我们创建一个初始化(空脚本)来创建Jinja2的使用环境。
现在你应该有这样的结构:
myapp/
__init__.py
templates/
python_script_tmpl
让我们开始在该my_app
目录的命令,并运行以下行(doc to install jinja2):
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader("__init__", "templates")) #use the blank __init__ script to init the environment, and the templates folder to load templates
tmpl = env.get_template("python_script_tmpl") #load the template
tmpl.stream(python="/usr/bin/env python3").dump("python_script.py") #create from the template a script called python_script.py
现在在根的my_app你应该有脚本python_script.py
它应该看起来像:
#!/usr/bin/env python3
def main():
print("It works")
与最终的文件夹结构:
myapp/
__init__.py
python_script.py
templates/
python_script_tmpl
假设shebang and the env is correctly configured你可以没有问题运行该脚本。 (虽然不是一个非常有用的脚本)
现在模板有什么意义?
如果你必须重复很多时间(例如shebang),并且你必须修改它,那么你必须修改它出现的每个文件,如果你使用模板,你只需修改一次变量并注入它。这是模板的直接优势。
P.S:由于@CharlesDuffy提到,这个脚本可能是从一个RPM
包中提取的,所以除了学习目的或重新打包之外,我建议你使用rpm命令行工具来运行整个包。
我认为语法是为模板变量(如[Jinja](http://jinja.pocoo.org))。所以会发生什么是你在一个不同的文件中声明了一个像'__python34:/ usr/bin/python3.4'这样的变量,然后在这个脚本上运行模板引擎,输出结果是'#!/ usr/bin/python3 。[这个线程](https://stackoverflow.com/questions/6908143/should-i-put-shebang-in-python-scripts-and-what-form-should-it-take)几乎解释了RPM的模板引擎使用'%{var}'在Python – Adonis