8

OS X 10.8 (with Python 2.7) では.pyc環境変数を設定してもファイルが作成されるようですPYTHONDONTWRITEBYTECODE=1

これが起こらないようにするにはどうすればよいですか、またはソース ファイルと同じ場所にこのファイルを作成しないように Python を説得するにはどうすればよいでしょうか。

4

4 に答える 4

18

これをテストしたところ、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.7python2.6python2.5

また、Apple がインストールした 10.5 から 10.7 までのすべての Python と、私が利用できるさまざまなマシンにある python.org、Enthought、MacPorts、Homebrew Python のすべて、および 2 つの標準の python パッケージで動作します。さまざまな Linux ディストリビューション。

したがって、これバグである場合、それは非常に具体的なものです。つまり、どの Python (および在庫がない場合はどのようにインストールしたか) と、どの OS X 10.8 かを正確に教えていただく必要があります。

PYTHONDONTWRITEBYTECODEPythonの環境にない可能性がはるかに高いです。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=1export PYTHONDONTWRITEBYTECODE

于 2012-12-15T01:55:45.453 に答える
6

次の方法で、.pyc と .pyo ファイルの両方の作成を回避できます。python -B script.py

于 2012-11-29T16:20:02.607 に答える
5

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
于 2012-12-16T21:35:24.417 に答える
1

Pythonスクリプトの上部にこれをお勧めします:

#!/usr/bin/env python -B

または、sys.dont_write_bytecodeメソッドを使用します。

参照: .pyc ファイルを回避するには? これは、2.6 より前の Python で機能する 1 つの方法を含む、いくつかの他の解決策を示唆しています。

于 2012-12-18T11:53:12.390 に答える