1

私は、2 つの django プロジェクトを持つシステムに取り組んでいます。サーバーとクライアント。サーバーは、複数のクライアント インスタンスの管理を担当します。このシステムは、エラー ログの処理を Sentry/Raven に依存しています。

私の問題は、Sentry では各クライアント (sentry プロジェクト) を手動で作成および構成する必要があることです。クライアント インスタンスの数が多いため、サーバー プロジェクトで手動でこれを行う必要があります。サーバー上に新しいクライアントを作成すると、新しい Sentry プロジェクトが作成されるように、プロセスを自動化しようとしていました。

この質問のように、プロジェクトで Sentry ORM に直接アクセスしようとしました。しかし、これは行き止まりであることが明らかになりました。だから私はこれを行うためにpython scryptを書きました。

上記のスクリプトでは、sentry から DJANGO_SETTINGS_MODULE をインポートし、必要なものが得られるまでそれを操作します。

sys.path.append("/sentry/")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", 'sentry_configuration_file')

from sentry.models import *

#Do my thing here

シェルでスクリプトを実行すると、完全に機能します。

ただし、サブプロセスを使用してDjangoプロジェクト内で呼び出すと

from subprocess import call
call("/sentry/venv/bin/python /sentry/my_script.py", shell=True)

スクリプトは、"from sentry.models import * 行で次のエラーを生成します。

ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e))
ImportError: Could not import settings 'configurations.settings' (Is it on sys.path?): No module named configurations.settings

sentry が virtualenv 内にインストールされていることに気付いたかもしれません。ただし、virtualenv の python への正しいパスを提供する限り、bash でこのスクリプトを呼び出すときにアクティブ化する必要はありません。

私はここで迷っています。シェルを使用して正常に実行されたときに、スクリプトが subprocess.call を使用して失敗する理由は特にありません。

任意のポインターは非常に高く評価されます。

ありがとう。

4

1 に答える 1

2

誰かがこの質問に出くわしたことがある場合は、subprocess.call を subprocess.Popen に置き換えることで問題を解決できました。

Popen の素晴らしいところは、引数「env」でプロセスの環境を指定できることです。

そう

my_env = os.environ
my_env["DJANGO_SETTINGS_MODULE"] = "sentry_configuration_file"

result = Popen(command, shell=True, env=my_env)

魅力のように働きました。

于 2013-12-05T14:17:05.203 に答える