0

何らかの理由で、django ビューからソース コード フォルダーをチェックアウトする必要があり、これには 'Popen' を使用します。

すべてが正常に動作し、django runserver を使用すると完璧に動作します。

しかし、コードを apache2 + wsgi にデプロイした後、Popen が正しく動作しません。コマンドが実際に終了する前に、常に戻ります。エラーもスローされず、不完全な出力がスローされるだけで、チェックアウトされたフォルダーをチェックしましたが、それらも不完全です。

svn チェックアウト プロセス全体に約 5 ~ 6 秒かかり、標準出力は非常に大きくなります (約 3000 文字)。

pysvnのライブラリがあることは知っていますが、古いubuntuサーバーにインストールするのは難しそうです。

そして基本的に、私が今行き詰まったのはそれだけです。

チェックアウトを呼び出すために使用したコードは次のとおりです。

def run_cmd(argument_list, output_file = None):
    print "arguments", argument_list
    p = subprocess.Popen(argument_list, stdout=subprocess.PIPE)

    content = ""
    while True:
        line = p.stdout.read(50)

        if not line:
            break

        content += line

    if output_file:
        fout = file(output_file, "w")
        fout.write(content)
        fout.close()

    return content


output = run_cmd(["/usr/bin/svn", "--ignore-externals", "co", svn_url, src_folder] )

役立つ情報を次に示します。

  1. チェックアウトするファイル数: 約 3000
  2. チェックアウトに必要な時間: 約 5 ~ 6 秒 (ファイル ベースの SVN の場所のみ)
  3. Python バージョン: 2.6.4
  4. ジャンゴのバージョン: 1.1.2
  5. mod wsgi バージョン: 3.3

私はこれに何時間もこだわっていますが、ヒントは大歓迎です!

ありがとう。

4

1 に答える 1

1

わかりました、今日はさらに 3 時間もがきました。私はついに問題を解決しました。

ここで何が起こっているのか、wsgi と popen は実際には問題ありません。実際の問題は、チェックアウト用のソース コード ファイルに実際に特殊文字が含まれており、svn チェックアウト プロセスが中断されることです (次のエラーが発生します)。

svn: 文字列を 'UTF-8' からネイティブ エンコーディングに変換できません

wsgi とコンソールでは LC_LANG の値が異なります。これは、runserver と wsgi の動作の違いを説明しています。

最後に、「/etc/apache2/envars」のファイルを変更して問題を解決し、次の行のコメントを外しました。

. /etc/デフォルト/ロケール

設定を有効にするには、「apache2ctl restart」の代わりに「apache2ctl stop」と「apache2ctl start」でサーバーを再起動する必要があることに注意してください。

私は実際にpexpectを使用して問題を見つけましたが、明らかな遅延の問題があったため、後で Popen に戻りました。

これが run_cmd の最終的なコードです。うまくいけば、将来誰かを助けることができます:

def run_cmd(argument_list, output_file = None):
    print "arguments", argument_list


    #command = " ".join(argument_list)
    #content = pexpect.run(command)
    #if output_file:
        #fout = file(output_file, "w")
        #fout.write(content)
        #fout.close
    #return content

    p = subprocess.Popen(argument_list, bufsize=50, stderr=subprocess.STDOUT, stdout=subprocess.PIPE) #showed error message as well

    content = ""
    while True:
        line = p.stdout.read(50)

        if not line:
            break

        content += line

    #raise Exception(content)   #for debug

    if output_file:
        fout = file(output_file, "w")
        fout.write(content)
        fout.close()

    return content
于 2012-07-21T09:39:19.863 に答える