24

Pythonに存在する.pycファイルを無視させ、常にすべてのコード(インポートされたモジュールを含む)を直接解釈させる方法はありますか?グーグルは何の答えも出していないので、私はそうは思わないが、念のために尋ねる価値があるように思われた。

(なぜこれを実行したいのですか?数百台のコンピューターのクラスター上で繰り返し実行されるPythonスクリプトの大規模なパイプラインがあります。Pythonスクリプト自体は共有NFSファイルシステム上に存在します。どういうわけか、数百台実行された後はめったにありません。数時間に渡って、モジュールをインポートできないというエラーで突然クラッシュし始めます。.pycファイルの再生成を強制すると、問題が修正されます。もちろん、根本的な原因を修正したいのですが、その間、システムの実行を継続する必要があるため、可能であれば.pycファイルを無視するのが妥当な回避策のようです)。

PS私はPython2.5を使用しているので、-Bを使用できません。

4

6 に答える 6

13

それはあなたが求めていたものとは正確には異なりますが、既存の.pycファイルを削除してから、それ以上の作業を作成しませんか?その場合、-Bオプションを使用できます。

>python --help
usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-B     : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x
于 2010-08-17T15:14:57.747 に答える
13

標準のPythonライブラリのimpモジュールを使用して、ステートメントによって呼び出されるフック関数であるを再実装できます。特に、imp.load_module関数は、対応するものが存在する場合でもロードするために使用できます。デリケートな作業なので、私が指摘したページのすべてのドキュメントに加えて、インポート用のドキュメントを注意深く調べてください。ドキュメント自体は、代わりにインポートフックを使用することを提案しています(PEP 302による)が、この特定のタスクでは、それはさらに難しいと思います。__builtins__.__import__importfrom.py.pyc

ところで、観察された問題の原因として考えられるのは.pyc、同時にファイルを書き込もうとしている異なるコンピューター間の競合状態です。NFSロックは不安定なことで有名であり、常にそうでした;-)。使用しているすべてのPythonコンパイラが同じバージョンである限り(そうでない場合は、とにかく大きな問題が発生します;-)、これらの.pyファイルをすべてプリコンパイルし.pycて、ディレクトリを読み取り専用にします。__import__後者は、何らかの理由でプリコンパイルできない場合でも、とにかく(ハッキングではなく)最も簡単なアプローチのようです。

于 2010-08-17T15:21:35.487 に答える
6

同じ質問でPython2.6以降を使用している人がいる場合、最も簡単な方法は次のとおりです。

  1. すべての.pycファイルを削除します
  2. オプションを指定してすべてのPythonインタープリターを実行すると、-B.pycファイルが生成されなくなります。

ドキュメントから:

-B指定されている場合、Pythonはソースモジュールのインポート時に.pycまたは.pyoファイルを書き込もうとしません。PYTHONDONTWRITEBYTECODEも参照してください。

バージョン2.6の新機能。

すべての.pycsを削除できない場合は、次のことができます。

1)オプションを使用してすべてのPythonインタープリターを実行し-B -Oます。

これにより、Pythonは.pycファイルではなくバイトコードの.pyoファイルを検索し(-O)、バイトコードファイルを生成しないようにPythonに指示します(-B)。

2つのオプションの組み合わせは、これまでに使用したことがないと仮定すると、Pythonはバイトコードファイルを生成せず、以前の実行で生成されたバイトコードファイルを検索しないということです。

ドキュメントから:

-B指定されている場合、Pythonはソースモジュールのインポート時に.pycまたは.pyoファイルを書き込もうとしません。PYTHONDONTWRITEBYTECODEも参照してください。

バージョン2.6の新機能。

-O基本的な最適化をオンにします。これにより、コンパイルされた(バイトコード)ファイルのファイル名拡張子が.pycから.pyoに変更されます。PYTHONOPTIMIZEも参照してください。

于 2014-07-23T11:47:42.177 に答える
0

PEP 3147-PYCリポジトリディレクトリは、Python3.2以降で非常に興味深いものになる可能性があります。

于 2010-08-18T00:48:05.200 に答える
0

おそらく、これを回避するには、たとえば、スクリプトを定期的にシャットダウンして.pycファイルを削除するジョブをスケジュールすることができます。

于 2010-08-17T15:14:39.847 に答える
0

ファイルからコードをロードしている場合、Pythonがコードを直接解釈することはないと思います。インタラクティブシェルを使用している場合でも、Pythonはインポートされたモジュールを.pycにコンパイルします。

そうは言っても、スクリプトを起動する前に、シェルスクリプトを記述して、すべての.pycファイルを削除することができます。それは確かにすべての実行の前に完全な再構築を強制するでしょう。

于 2010-08-17T15:25:22.967 に答える