89

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

それが機能することがわかりましたが、仮想環境をサポートするために#/usr/bin/python -u必要です。pythonPATHenv

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

4

9 に答える 9

43

一部の環境では、env は引数を分割しません。python -uだからあなたのenvはあなたのパスを探しています。sh を使用して回避できます。シバンを次のコード行に置き換えると、すべて問題ありません。

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

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

于 2012-01-29T07:25:40.520 に答える
28

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

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

FreeBSD ではうまく動作するようです。

于 2014-01-29T13:57:24.840 に答える
17

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

于 2012-01-19T05:34:29.740 に答える
13

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

my2c

于 2010-07-22T07:16:31.270 に答える
8

これは、実行可能パスではスペースが許可されないという制限/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 にあると仮定すると、シバン行は次のようになります。

#!/usr/local/bin/envns python -u

Ubuntu 13.10 および cygwin x64 でテスト済み。

于 2014-07-30T20:11:23.507 に答える
5

これはクラッジであり、bash が必要ですが、動作します:

#!/bin/bash

python -u <(cat <<"EOF"
# Your script here
print "Hello world"
EOF
)
于 2010-07-22T07:32:10.020 に答える
4

Larry Cai の回答から構築するenvと、コマンド ラインで変数を直接設定できます。つまり、前の同等の設定に-u置き換えることができます:PYTHONUNBUFFEREDpython

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

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

于 2015-11-24T20:00:08.760 に答える