1

Pythonインポートステートメントがランダムに失敗するエラーをデバッグしようとしています。それ以外の場合は、正常に実行されます。

これは私が見る例外の例です。時々私はこれを見るでしょう、時々私は別のモジュールで別のものを見るでしょう、しかしそれは常に4つのモジュールの1つでヒットするようです。

ERROR:root:/home/user/projecteat/django/contrib/auth/management/__init__.py:25:     RuntimeWarning: Parent module 'django.contrib.auth.management' not found while handling absolute import
from django.contrib.contenttypes.models import ContentType

ランダムな性質のため、スレッドの問題であるとほぼ確信していますが、インポートエラーが発生する理由がわからないため、デバッグで何を探すべきかわかりません。異なるスレッドが同じモジュールをロードしようとしている場合、これはファイルシステムの競合が原因である可能性がありますか?

Django1.4のLiveServerTestCaseをGoogleAppEngineの開発サーバーで動作させようとしています。メインスレッドはdjangoのテストフレームワークを実行します。LiveServerTestCaseベースのテストクラスをロードすると、子スレッドが生成され、ローカルウェブサーバーであるAppEnginedev_appserverが起動されます。メインスレッドは引き続きテストを実行し、Seleniumドライバーを使用してHTTPリクエストを作成します。これは、子スレッドのdev_appserverによって処理されます。

テストフレームワークは、テストケースクラスを破棄する前に、LiveServerTestCaseベースのクラスでいくつかのテストを実行する場合があります。分解時に、子スレッドは終了します。

例外は子(HTTPサーバー)スレッドで発生しているようです。ほとんどの場合、単一のテストケースクラス内のテスト間で発生しています。

App Engine LiveServerTestCaseクラスのコードは次のとおりです:https ://github.com/dragonx/djangoappengine/blob/django-1.4/test.py

この質問に必要なすべてのデバッグ情報を提供するのはかなり難しいです。私は主に、PythonのインポートステートメントでRuntimeWarningエラーが発生する理由についての提案を探しています。

4

1 に答える 1

0

私自身の質問に対する部分的な答えがあります。何が起こっているのかというと、2つのスレッドが実行されているということです。

スレッド1は、HTTPリクエストを処理するdev_appserver(dev_appserver_main)内のメイン内部関数を実行しています。

スレッド2は、Seleniumベースのテストケースを実行しています。このスレッドは、何かを実行するためのコマンドをブラウザーに送信します(これにより、間接的にHTTP要求が生成され、スレッド1に再入力されます)。次に、ステータスを確認するためにSeleniumにさらにリクエストを発行するか、結果を確認するためにデータストアクエリを実行します。

問題は、すべてのHTTPリクエストを処理するときに、スレッド1( dev_appserver)が環境を変更して、特定のフォルダーにアクセスできないようにすることです(app.yamlで除外されたフォルダー、およびappengineの一部ではない環境)。この時点でスレッド2がコードを実行している場合、これらのフォルダーにある場合、特定のインポートがロードに失敗する可能性があります。

于 2012-07-27T13:15:41.220 に答える