什么';python脚本中的s%{uuu python34}?

什么';python脚本中的s%{uuu python34}?,python,Python,我看到一个python脚本以 #!%{__python34} from __future__ import unicode_literals # Whether we're Python 2 我猜_python34是用来获取python2或python3.4的路径的,但它似乎不起作用,因为输出消息说该文件不存在 谢谢。我相信这是一种被称为“模板化”的技术(%{var}用于模板引擎中,我们可以看到,尤其是.spec文件)。存在很多模板引擎,等等(可以找到更详尽的列表) 现在,让我们使用Jinj

我看到一个python脚本以

#!%{__python34}

from __future__ import unicode_literals
# Whether we're Python 2
我猜_python34是用来获取python2或python3.4的路径的,但它似乎不起作用,因为输出消息说该文件不存在


谢谢。

我相信这是一种被称为“模板化”的技术(
%{var}
用于模板引擎中,我们可以看到,尤其是
.spec
文件)。存在很多模板引擎,等等(可以找到更详尽的列表)

现在,让我们使用Jinja2创建一个简单的示例,我们创建的第一件事是模板(让我们按照惯例将其放在
templates
文件夹中),我们称之为python\u script\u tmpl:

#!{{ python }}

def main():
    print("It works")
现在,让我们创建一个init(空脚本)来创建一个与Jinja2一起使用的环境

现在,您应该具有如下结构:

myapp/
  __init__.py
  templates/
    python_script_tmpl
让我们在
my_app
目录中启动一个shell,并运行以下行():

现在,在my_应用程序的根目录下,应该有脚本
python_script.py
,它应该看起来像:

#!/usr/bin/env python3

def main():
    print("It works")
使用最终文件夹结构:

myapp/
  __init__.py
  python_script.py
  templates/
    python_script_tmpl
假设您可以运行脚本而不会出现问题。(尽管不是一个非常有用的脚本)

现在做模板有什么意义?

如果你必须重复很多部分的时间(例如shebang),并且你必须修改它,那么你必须为每个出现的文件修改它,如果你使用模板,你只需要修改变量一次并注入它。这是模板化的一个直接优势


注:正如@CharlesDuffy提到的,这个脚本可能是从
RPM
包中提取出来的,所以除了学习或重新打包之外,我建议您使用RPM命令行工具来运行整个包。

我认为语法是针对模板变量的(比如)。因此,发生的情况是,您在另一个文件中声明了一个变量,如
\uuu python34:/usr/bin/python3.4
,然后在此脚本上运行模板引擎,输出结果将是
#/usr/bin/python3.4
非常详细地解释了Python中shebang的用法
%{var}
由RPM的模板引擎使用。那么,这大概应该在包构建时被替换。@charlesduff说得很好,我编辑了我的文章来反映这一点。@charlesduff和asettouf,谢谢你的回答和评论。该文件确实来自通过RPM安装的软件包。如果我理解更正了,它不会出现在安装的文件中吗?i、 例如,我想在RPM管理的安装过程中,应该用正确的shebang行替换它?@dlz正确,假设RPM的安装满足所有要求,在安装后,正确的shebang确实应该出现在这个文件中。@dlz,我建议向发行版/repo/&c提交错误报告。你从我这儿拿到包裹了。
myapp/
  __init__.py
  python_script.py
  templates/
    python_script_tmpl