2013-05-14 14 views
7

私は私のpythonスクリプトのトップに標準的なシバンを持っています。Pythonのシバンにコマンドラインオプションを含めることは可能ですか?

#!/usr/bin/env python 

しかし、私はまだ、多くの場合、私は私のスクリプトを実行してログファイルにバッファリングされていない出力をエクスポートしたいので、私は呼び出し終わる:

$ python -u myscript.py &> myscript.out & 

は、私がシェバングに-uオプションを埋め込むことができます以下のようなので...

#!/usr/bin/env python -u 

とだけコール:

$ ./myscript.py &> myscript.out & 

...まだバッファリングを取得するには?私はうまくいかないと思うし、試してみる前にチェックしたい。これを達成するものはありますか?

+0

はい、そうすべきです。 "シバン"は、スクリプトを担当するバイナリアプリケーションへのポインタに過ぎません。あなたがエイリアスppython = "python -u" 'を作成して'#!/ usr/bin/env ppython'を使用することができない場合 – Torxed

+0

これは可能です。 – aestrivex

+1

Torxed、あなたはあなたの答えを試しましたか?そのアプローチは、OSXやLinuxではうまくいきません。お使いのOSで動作する場合は、それが興味深いので詳細を共有してください。 OSXやLinuxでうまく動作しない(または、私が思うに、UNIXの風味がある)理由は、 'env'がパス上の実行可能ファイルを検索し、エイリアスがパスにないからです。エイリアスはシバンラインでも同じように動作しません。シバンラインでは組み込みが機能しないのと同じ理由でエイリアスは動作しません。あなたのOSがこれを許すなら、共有してください! –

答えて

9

シバン行に引数を付けることができますが、ほとんどのオペレーティングシステムでは引数の数が非常に限られています。 POSIXでは、1つの引数だけがサポートされている必要があります。これはLinuxを含む一般的なものです。

/usr/bin/envコマンドを使用しているので、すでに1つの引数をpythonで使い切っているので、別の引数-uを追加することはできません。 python -uを使用する場合は、/usr/bin/envではなく、絶対パスをpythonにハードコードする必要があります。

#!/usr/bin/python -u 

この関連の質問を参照してください。これを行うにはHow to use multiple arguments with a shebang (i.e. #!)?

+0

ありがとうございます。それは十分に見えましたが、私はキャッチがあることを知っていました。 =)POSIXの要件の奥深くに誰かがいますか?複数の引数をサポートすることが可能な場合、この機能がどれほど優れているかについて電子メールを送ることができますか? – Mittenchops

+1

おそらくそうではありません。これがいつも働いている方法であり、POSIXは既存の動作を単純に標準化しました。彼らがPOSIXを変更したとしても、十分な実装が再設計されているので、移植することができます。 – Barmar

3

ポータブルな方法は、あなたのオプションを具体別の実行可能ファイルを作成することです。例えば

、あなたのパスにこのファイルを入れて、upythonという名前を付け、そしてそれを実行可能にします。

#!/usr/bin/env bash 
python -u -and -other -options "[email protected]" 

...何が必要なオプション使用。次に、あなたのmyscript.pyスクリプトは次のようになります

#!/usr/bin/env upython 
(... your normal Python code ...) 

Torxedはシェルのエイリアスを経由してこれを行うことが示唆されました。それがunixのどのバージョンでもうまくいけば、私は非常に驚くだろう。私がテストしたばかりのディストリビューションでは動作しません。私のアプローチはあらゆるUNIXで動作します。

+0

ps:cmdline引数を別のスクリプトや関数に渡す適切な方法は、クォートされていない引数がスペースで区切られてしまうので、引用符付きの '$ @"(対称 '$ @')を使用しています。最後に、 'env bash'を使うことは絶対に避けたいですが、' bash'へのパスを使うことをお勧めします(例えば、 '#!/ bin/bash ')を直接実行します。 Pythonは確かに問題があります。バッシュ、そうではありません。より大きな問題は、 'PATH'を使って別のツール(python、makeなど)を使用して間違ったものを誤って使用していることです。 – michael

+0

@michael_n:引用符で同意しました。 –

+0

このようなラッパースクリプトの場合、ラッパーがプロセスリストに表示されなくなるように、「exec」を入れるのが好きです。私は、 "exec python -u - と--other ...." –

関連する問題