2017-08-02 92 views
3

我看到一个Python脚本开始Python脚本中的%{__ python34}是什么?

#!%{__python34} 

from __future__ import unicode_literals 
# Whether we're Python 2 

我猜__python34是用来获取python2或Python 3.4的路径,但它似乎不工作,作为输出的消息说,该文件不存在。 ..

谢谢。

+7

我认为语法是为模板变量(如[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

回答

2

我相信这是被称为“模板”(%{var}被用于例如通过使用RPM模板引擎我们可以看到in this example,看到.spec文件特别)的技术。而很多这些模板引擎的存在,Jinja2Mako等等等等(更详尽的清单,可以发现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命令行工具来运行整个包。

+1

中使用shebang。据推测,这应该在包装制造时被取代。 –

+0

@CharlesDuffy非常好的一点,我编辑我的帖子来反映这一点。 – Adonis

+1

@CharlesDuffy和asettouf,谢谢你的回答和评论。该文件确实来自通过RPM安装的软件包。如果我理解得更正了,那么预计不会显示在已安装的文件中?也就是说,我猜它应该在由RPM管理的安装过程中被替换为正确的shebang行? – dlz