2017-08-02 8 views
3

私は、出力メッセージは、ファイルが存在しないことを言うように、私はpython2かのpython 3.4のパスを取得するために使用され__python34思いますが、それは仕事をいないようです1つのPythonスクリプトはPythonスクリプトで%{__ python34}とは何ですか?

#!%{__python34} 

from __future__ import unicode_literals 
# Whether we're Python 2 

で始まるご覧ください。 ..

ありがとう。

+7

私は構文がテンプレート変数([Jinja](http://jinja.pocoo.org)のようなものです)と思っています。ですから、 '__python34:/ usr/bin/python3.4'のような変数を別のファイルに宣言し、このスクリプトでテンプレートエンジンを実行すると、出力は'#!/ usr/bin/python3 .4' [このスレッド](https://stackoverflow.com/questions/6908143/should-i-put-shebang-in-python-scripts-and-what-form-should-it-take)かなり説明します。 Pythonでシボンを使う – Adonis

答えて

2

私は(%{var}は、我々がin this exampleを見ることができるようにRPMが使用するテンプレートエンジン内のインスタンスのために使用され、特に.specファイルを参照してください)、それは、「テンプレート」として知られている技術であると考えています。そして、これらのテンプレートエンジンの多くは

のは、簡単な例を作成するためにJinja2のを使用してみましょうが、最初に作る事がテンプレートであるMakoなどなど(より完全なリストは、hereを見つけることができる)、Jinja2、存在しますのは、それを呼びましょう、(のが慣例に従うことをtemplatesフォルダに入れてみましょう)、python_script_tmpl:

#!{{ python }} 

def main(): 
    print("It works") 

今度はJinja2のに使用するための環境を作成するためにのinit(空のスクリプト)を作成してみましょう。

今、あなたのような構造を持っている必要があります。rootで

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 

そして今:

myapp/ 
    __init__.py 
    templates/ 
    python_script_tmpl 

だがmy_appディレクトリにシェルを起動し、次の行(doc to install jinja2)を実行してみましょう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あなたは問題なしでスクリプトを実行することができますと仮定。 (かなり有用なスクリプトではありませんが)

テンプレートのポイントは何ですか?

多くの時間(例えばシバン)を繰り返す必要があり、それを修正する必要がある場合は、表示されるすべてのファイルに対して修正する必要があります。変数を一度変更して注入するだけで済みます。これはテンプレート化の単純な利点です。

P.S:@CharlesDuffyは、RPMパッケージから抽出される可能性が高いため、学習目的以外のパッケージや再パッケージ化を除いて、rpmコマンドラインツールを使用してパッケージ全体を実行することをお勧めします。

+1

'%{var}'はRPMのテンプレートエンジンで使われています。おそらく、これはパッケージのビルド時に置き換えられるはずです。 –

+0

@CharlesDuffy非常に良い点は、私はこれを反映するために投稿を編集しました。 – Adonis

+1

@CharlesDuffyとasettouf、答えとコメントありがとう。このファイルは実際にはRPMによってインストールされたパッケージからのものです。私が訂正したことを理解すれば、インストールされたファイルには表示されません。 RPMで管理されているインストール中に正しいシバン行に置き換えられているはずですか? – dlz

関連する問題