2012-07-21 38 views
0

由於某些原因,我需要從django視圖中籤出一個源代碼文件夾,並且我使用了'Popen'。django wsgi + Popen + svn結帳

一切工作正常,它使用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. Django的版本:1.1.2
  5. MOD WSGI版本:3.3

我一直停留在這幾個小時,任何暗示是非常感謝!

謝謝。

+0

是否svn_url包括用戶名和密碼?部署webserver作爲測試服務器的相同用戶運行? – 2012-07-21 07:52:31

+0

nope,它是一個基於svn位置的文件,所以不需要用戶名和密碼。 – 2012-07-21 07:58:25

+0

測試環境和部署Web服務器進程是否在同一用戶下運行?如果沒有,請嘗試在運行'manage.py runserver'之前對運行部署網絡服務器的同一用戶執行操作。 – 2012-07-21 08:11:10

回答

1

好的,今天又掙扎了3個小時。我終於解決了這個問題。

這裏是發生了什麼事情,在WSGI & POPEN實際上是很好,真正的問題是檢查出一些源代碼文件實際上包含特殊字符,並且打破了SVN檢查過程中(與下面的錯誤)

的svn:無法從「UTF-8」字符串轉換爲本地編碼

的WSGI和控制檯有LC_LANG不同的值,並且解釋的runserver和WSGI之間的不同的行爲。

最後,我通過修改的 '的/ etc/apache2的/ envars' 的文件解決了這個問題並且未註釋以下行:

。在/ etc /默認/區域設置

請注意,您必須重新啓動通過「apache2ctl停止」和「開始apache2ctl」服務器,而不是「apache2ctl重啓」,以有設置生效。

我實際上使用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