web-dev-qa-db-ja.com

python with "#!/ usr / bin / env python"に引数を渡すことはできません

直接実行可能なpythonスクリプトが必要だったので、#!/usr/bin/env pythonでファイルを開始しました。ただし、バッファなしの出力も必要なので、#!/usr/bin/env python -uを試しましたが、 python -u: no such file or directoryで失敗します。

#/usr/bin/python -uが機能することがわかりましたが、pythonPATHを取得して仮想env環境をサポートする必要があります。

私のオプションは何ですか?

68
Eskil

これを有効にするには、環境変数を使用することをお勧めします。 python doc: http://docs.python.org/2/using/cmdline.html を参照してください。

あなたの場合:

export PYTHONUNBUFFERED=1
script.py
22
Larry Cai

一部の環境では、envは引数を分割しません。したがって、環境はパスで「python -u」を探しています。 shを使用して回避できます。 Shebangを次のコード行に置き換えてください。すべてうまくいきます。

#!/bin/sh
''''exec python -u -- "$0" ${1+"$@"} # '''
# vi: syntax=python

pS shへのパスを気にする必要はありませんよね?

40
Ade YU

LinuxでShebangを使用すると、インタープリター名の後の行全体が単一の引数として解釈されます。 python -uは、/usr/bin/env 'python -u'と入力したかのようにenvに渡されます。 /usr/bin/envは、存在しないpython -uというバイナリを検索します。

15
Jimmy Hartzell

Shebang行に引数を渡すことは標準ではなく、実験したようにLinuxでenvと組み合わせて動作しません。 bashでの解決策は、組み込みコマンド「set」を使用して必要なオプションを設定することです。 pythonコマンドを使用して、stdinのバッファリングされていない出力を設定するために同じことができると思います。

my2c

13
neuro

/ 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でテスト済み。

9
philwalk

これは少し古くなっているかもしれませんが、env(1)マニュアルでは、その場合は「-S」を使用できると記載されています

#!/usr/bin/env -S python -u

FreeBSDではかなりうまくいくようです。

7
user3249132

これはkludgeであり、bashが必要ですが、機能します:

#!/bin/bash

python -u <(cat <<"EOF"
# Your script here
print "Hello world"
EOF
)
5
imgx64

Larry Caiの答えを基にして、envを使用すると、コマンドラインで変数を直接設定できます。つまり、-uは、PYTHONUNBUFFEREDの前の同等のpython設定で置き換えることができます。

#!/usr/bin/env PYTHONUNBUFFERED="YESSSSS" python

RHEL 6.5で動作します。 envの機能はほぼ普遍的であると確信しています。

4
Mad Physicist