OS X 10.8 (with Python 2.7) では.pyc
環境変数を設定してもファイルが作成されるようですPYTHONDONTWRITEBYTECODE=1
これが起こらないようにするにはどうすればよいですか、またはソース ファイルと同じ場所にこのファイルを作成しないように Python を説得するにはどうすればよいでしょうか。
OS X 10.8 (with Python 2.7) では.pyc
環境変数を設定してもファイルが作成されるようですPYTHONDONTWRITEBYTECODE=1
これが起こらないようにするにはどうすればよいですか、またはソース ファイルと同じ場所にこのファイルを作成しないように Python を説得するにはどうすればよいでしょうか。
これをテストしたところ、Apple がインストールした Python 2.7 を使用して 10.8.2 で正常に動作します。
$ echo -e 'import bar\n' > foo.py
$ echo -e 'pass\n' > bar.py
$ export PYTHONDONTWRITEBYTECODE=1
$ python foo.py
$ ls -l bar.py*
-rw-r--r-- 1 abarnert staff 6 Dec 14 17:25 bar.py
$ unset PYTHONDONTWRITEBYTECODE
$ python foo.py
$ ls -l bar.py*
-rw-r--r-- 1 abarnert staff 6 Dec 14 17:25 bar.py
-rw-r--r-- 1 abarnert staff 118 Dec 14 17:26 bar.pyc
、、またはpython
で置き換えることができ、同じ結果が得られます。python2.7
python2.6
python2.5
また、Apple がインストールした 10.5 から 10.7 までのすべての Python と、私が利用できるさまざまなマシンにある python.org、Enthought、MacPorts、Homebrew Python のすべて、および 2 つの標準の python パッケージで動作します。さまざまな Linux ディストリビューション。
したがって、これがバグである場合、それは非常に具体的なものです。つまり、どの Python (および在庫がない場合はどのようにインストールしたか) と、どの OS X 10.8 かを正確に教えていただく必要があります。
PYTHONDONTWRITEBYTECODE
Pythonの環境にない可能性がはるかに高いです。Mark Ransom が示唆したように、次を追加することでこれを確認できます。
import os
print 'PYTHONDONTWRITEBYTECODE is', os.environ.get('PYTHONDONTWRITEBYTECODE', None)
と表示されている場合None
、これが問題です。
だから、PYTHONDONTWRITEBYTECODE
あなたの環境にはありません。しかし、あなたはそれがあなたの呼び出し環境にあると言います。そんなことがあるものか?を使用している場合bash
、最も可能性の高い理由は、それを忘れてexport
いることです。これを行うすべてのばかげた方法の中で、それが私が最も行った方法です。しかし、ここに私がやったことのある愚かなことがあります:
export
。あなたは望むことができecho $PYTHONDONTWRITEBYTECODE
ます、そしてそれは明確に設定されていpython
ますが、まだそれを見ていません…export
ますが、設定するのを忘れてください。何にも定義されていなくてもbash
できます。export PYTHONDONTWRITEBYTECODE
export $PYTHONDONTWRITEBYTECODE
. ( のような有効な識別子ではないものに設定することで、これを回避できます1
。)export
ただし、変数が間違っていることを忘れないでくださいexport
(通常、いくつかのキーストロークを節約しようとする不注意な履歴の誤用によるものです)。PYTHONDOTWRITEBYTECODE
見ても元気そう…</li>
python
.~/.bash_profile
し、再ロードしたり新しいシェルを起動したりする代わりに、「同じことを直接行うだけだ」と考え、ばかげたタイプミスをしてから、.bash_profile
以前に何が間違っていたのかを確認するために私を見て30分過ごします私のシェル履歴を見ることを考えています。subprocess
/ /whateverを使用してある Python スクリプトを別の Python スクリプトから起動os.exec*
し、わざわざクリーンな環境を要求してから、環境変数が表示されない理由を知りません。execl
の代わりにC から Python を起動execle
するため、意図したenvp
引数は効果がありません。(一部のプラットフォームでは、これによりセグメンテーション違反が発生する可能性がありますが、x86/x64 OS X では発生しません。)とにかく、ターミナルでこれを手動で試した場合は、もう一度試してください。
.bash_profile
、ランチャー シェル スクリプト、ランチャー Python スクリプトなどでこれを行っている場合は、関連するコードを表示してください。誰かがすぐに愚かなエラーを見つけます。彼らがあなたを笑ったら、代わりに私を笑うことができるように、私の答えを読むように伝えてください.
PS、私のテストでは、行export PYTHONDONTWRITEBYTECODE=1
を分離する代わりに行ったことに注意してください。移植性が必要なシェルスクリプトを除いて、私はいつもこれを行っています.私が上に列挙したすべてのばかげた間違い。PYTHONDONTWRITEBYTECODE=1
export PYTHONDONTWRITEBYTECODE
次の方法で、.pyc と .pyo ファイルの両方の作成を回避できます。python -B script.py
abarnert で説明されているように環境を設定することは、実際にはこれを行うための正しい方法ですが、セットアップで何らかの理由でそれが不可能な場合は、実行時にコードで設定できます。
スクリプトの先頭に次を追加するだけです。
import sys
sys.dont_write_bytecode = True
これにより、その時点以降、python はバイトコードを生成しなくなります。
$ cat > foo.py
#sample module
FOO="BAR"
$ python
>>> import sys
>>> sys.dont_write_bytecode = True
>>> import foo
>>> foo.FOO
'BAR'
>>> ^D
$ ls *.pyc
ls: *.pyc: No such file or directory
Pythonスクリプトの上部にこれをお勧めします:
#!/usr/bin/env python -B
または、sys.dont_write_bytecodeメソッドを使用します。
参照: .pyc ファイルを回避するには? これは、2.6 より前の Python で機能する 1 つの方法を含む、いくつかの他の解決策を示唆しています。