直接実行可能なpythonスクリプトが必要だったので、#!/usr/bin/env python
でファイルを開始しました。ただし、バッファなしの出力も必要なので、#!/usr/bin/env python -u
を試しましたが、 python -u: no such file or directory
で失敗します。
#/usr/bin/python -u
が機能することがわかりましたが、python
のPATH
を取得して仮想env
環境をサポートする必要があります。
私のオプションは何ですか?
これを有効にするには、環境変数を使用することをお勧めします。 python doc: http://docs.python.org/2/using/cmdline.html を参照してください。
あなたの場合:
export PYTHONUNBUFFERED=1
script.py
一部の環境では、envは引数を分割しません。したがって、環境はパスで「python -u」を探しています。 shを使用して回避できます。 Shebangを次のコード行に置き換えてください。すべてうまくいきます。
#!/bin/sh
''''exec python -u -- "$0" ${1+"$@"} # '''
# vi: syntax=python
pS shへのパスを気にする必要はありませんよね?
LinuxでShebangを使用すると、インタープリター名の後の行全体が単一の引数として解釈されます。 python -u
は、/usr/bin/env 'python -u'
と入力したかのようにenv
に渡されます。 /usr/bin/env
は、存在しないpython -u
というバイナリを検索します。
Shebang行に引数を渡すことは標準ではなく、実験したようにLinuxでenvと組み合わせて動作しません。 bashでの解決策は、組み込みコマンド「set」を使用して必要なオプションを設定することです。 pythonコマンドを使用して、stdinのバッファリングされていない出力を設定するために同じことができると思います。
my2c
/ usr/bin/envに代わるスクリプトを次に示します。これは、/ bin/bashに基づいて、実行可能パスではスペースを許可しないという制限付きで、ハッシュバング行で引数を渡すことを許可します。私はそれを "envns"(env No Spaces)と呼んでいます:
#!/bin/bash
ARGS=( $1 ) # separate $1 into multiple space-delimited arguments.
shift # consume $1
PROG=`which ${ARGS[0]}`
unset ARGS[0] # discard executable name
ARGS+=( "$@" ) # remainder of arguments preserved "as-is".
exec $PROG "${ARGS[@]}"
このスクリプトが/ usr/local/bin/envnsにあるとすると、Shebangの行は次のようになります。
#!/usr/local/bin/envns python -u
Ubuntu 13.10およびcygwin x64でテスト済み。
これは少し古くなっているかもしれませんが、env(1)マニュアルでは、その場合は「-S」を使用できると記載されています
#!/usr/bin/env -S python -u
FreeBSDではかなりうまくいくようです。
これはkludgeであり、bashが必要ですが、機能します:
#!/bin/bash
python -u <(cat <<"EOF"
# Your script here
print "Hello world"
EOF
)
Larry Caiの答えを基にして、env
を使用すると、コマンドラインで変数を直接設定できます。つまり、-u
は、PYTHONUNBUFFERED
の前の同等のpython
設定で置き換えることができます。
#!/usr/bin/env PYTHONUNBUFFERED="YESSSSS" python
RHEL 6.5で動作します。 env
の機能はほぼ普遍的であると確信しています。