2013-03-14 65 views
0

我一直在爲此奮鬥了幾個小時。我想發送一個由Django生成的文本文件到另一臺服務器。爲此,我使用scp和subprocess.call()。一切順利,我得到了return_code == 0,但scp發送0字節。在服務器端創建的文件是空的。問題在文件中寫入

我打印執行的確切命令,路徑是正確的,如果我把它放在一個shell中,它完美的工作。

下面是代碼:

form = SubmitForm(request.POST or None) 
context['form'] = form 
if request.method == 'POST': 
    if form.is_valid(): 
     # write file in ~/hipercic/apps/dcor/jobs/ 
     params_file = open('apps/dcor/jobs/job_' + datetime.today().strftime("%Y%m%d_%H%M%S") + '_params.txt', 'wb') 
     for key, val in form.cleaned_data.iteritems(): 
      params_file.write(str(val) + ' \n') 
     params_file.close  
     cmd = 'scp /home/guillet/hipercic/' + params_file.name + ' [email protected]:' 
     context['cmd'] = cmd 
     return_code = subprocess.call(cmd, shell=True) 
     context['return_code'] = return_code 
     return render(request, 'base_pending.html', context) 

我想到了一個可能的競爭條件,不必被髮送之前完全寫入時刻的文件,但沒有用time.sleep(3)改變。

此外,一些真正怪異和問題的心臟,如果我試圖重新打開和關閉後立即讀取文件,該文件是空的:

with open('/home/guillet/hipercic/' + params_file.name, 'rb') as f: 
    print f.read() # prints nothing!! 

回答

0

你做params_file.close代替params_file.close()

關閉文件正確地將數據刷新到你要寫信給

文件它與文件對象打交道時使用的關鍵字with很好的做法。這具有文件在其套件完成後正確關閉的優點。

+0

Duh.Thanks。我真的很慚愧。 – 2013-03-14 05:18:33

+0

感謝您的提示,我是新來的蟒蛇:) – 2013-03-14 05:25:00