2

「test.py」などのテストスクリプトがあり、スクリプトが開始する前に特定の環境変数を設定して実行するように作成したいと思います。

#!/usr/bin/env TEST=anything python

print "Hello, world."

これを実行すると、通常は期待どおりに機能します。

$ python test.py 
Hello, world.

ただし、プログラムとして実行すると、次のようになります。

$ chmod +x test.py
$ ./test.py 

文字列が出力されることはありません。代わりに、実行が停止し、「top」が100%CPUを使用している「test.py」と呼ばれるプロセスを報告します。

これは私のUbuntuマシンでのみ発生し、OSXでは問題ないようです。

その理由は、最終的には、次のように設定して、特定のスクリプトを常に32ビットPythonで実行するようにしたいためです。

#!/usr/bin/env VERSIONER_PYTHON_PREFER_32_BIT=yes python

ファイルの先頭にあります。ただし、スクリプトがLinuxマシンで実行されないことを意味する場合、これは失敗です。指定された環境変数が何と呼ばれていても、同様の効果があることがわかりました。ただし、環境変数が設定されていない場合:

#!/usr/bin/env python

print "Hello, world."

スクリプトは問題なく実行されます。

$ ./test.py 
Hello, world.

これはPythonまたはのバグenvですか、それとも何か間違ったことをしていますか?

4

3 に答える 3

3

Linuxでは、

#!/usr/bin/env TEST=anything python

TEST=anything python1つの引数として。に渡しますenv。したがってenv、引数を適切に処理しません。

肝心なのは、シバンラインの後にコマンドを1つだけ置くことができenv、それ以外はせいぜい無視されるということです。

シバンのウィキペディアのエントリから:

もう1つの移植性の問題は、コマンド引数の解釈です。Linuxを含む一部のシステムは、引数を分割しません[24] ; たとえば、次のような最初の行でスクリプトを実行する場合、

#!/ usr / bin / env python -c

つまり、python -cは、2つの引数ではなく、1つの引数として/ usr / bin/envに渡されます。Cygwinもこのように動作します。

于 2012-04-18T20:18:20.567 に答える
1

/usr/bin/env VERSIONER_PYTHON_PREFER_32_BIT=yes python正しく動作するかどうかは疑わしい。

代わりに、Pythonで環境変数を設定してみてください。

import os

os.environ['VERSIONER_PYTHON_PREFER_32_BIT'] = 'yes'
于 2012-04-18T20:19:11.697 に答える
0

少なくともLinuxでは、おそらくVERSIONER_PYTHON_PREFER_32_BITを忘れる必要があります。Macでは、シェルラッパーを使用できます。

次に、Linuxでは、小さなスタブpythonスクリプトやbashスクリプトなどを使用して、VERSIONER_PYTHON_PREFER_32_BITを再発明する必要があります。これには、次のようなものがあります。

>>> import platform
>>> platform.machine()
'x86_64'
>>> platform.processor()
'x86_64'
于 2012-04-18T21:53:04.687 に答える