2011-04-15 38 views
0

我正在創建一個從用戶處獲取輸入文件的Django應用程序。我想使用子進程模塊獲取文件並將其作爲參數傳遞給外部腳本並收回結果。子進程.Popen調用的格式是什麼。我想,也可以將選項傳遞給腳本,例如-a。 換句話說如何將一個subprocess.Popen呼叫樣子的命令行看起來是這樣的:在Python中使用子進程

./myscript -option file 

也有關於腳本我試圖運行的路徑的任何問題。非常感謝。

這是我在我的views.py中使用的代碼。我只是想看看一個簡單的cp命令工作以及如何傳遞參數:

def upload_file(request): 

    if request.method == 'POST': 
    form=UploadFileForm()   
    form = UploadFileForm(request.POST, request.FILES) 
     if form.is_valid(): 
      handle_uploaded_file(request.FILES['file']) 
      return HttpResponseRedirect('/upload') 
    else: 
     form = UploadFileForm() 
    return render_to_response('upload_file.html', {'form': form}) 

def handle_uploaded_file(f): 

    p=subprocess.Popen(['/bin/cp',f , '/home/dutzy/Desktop']) 
+0

該路徑取決於您的Web服務器如何與您的代碼交談。你必須更具體。 – 2011-04-15 21:42:07

+0

我正在使用django開發服務器 – Bigdinrock 2011-04-15 22:04:11

回答

1

您只需通過你的可執行文件名的元組或列表(在$PATH或相對)和它的參數。

import subprocess 
p = subprocess.Popen(('./myscript', '-option', 'file')) 
+0

我有一個函數handle_uploaded_file(f)我嘗試了一個使用標準unix命令的示例:p = subprocess.Popen(['cp','f','/ home/dutzy /桌面/ mysite的'])。我沒有正確傳遞文件參數? – Bigdinrock 2011-04-15 21:42:36

+0

刪除f中的引號。那是:['/ bin/cp',f,'/ home/dutzy ....']。但不要這樣做,這是複製文件的可怕方法。相反,使用'shutil'模塊:http://docs.python.org/library/shutil.html – yan 2011-04-15 21:44:13

+0

我得到一個execv()arg 2必須只包含字符串錯誤,我真的不想用這個複製文件方法。我只是想弄清楚如何在子進程調用中傳遞文件參數,這是我想到的第一種方法:) – Bigdinrock 2011-04-15 21:49:52

4

subprocess.Popen有一個非常可以理解的語法:

subprocess.Popen(['./myscript', '-option', 'file']) 

只要看看通過例子,你會得到的格局。

1

request.FILES['file']不是字符串文件名;這是一個UploadedFile對象。 Refer to the Django docs看看你可以用這個對象做什麼。

嘗試獲取路徑名並執行復制是一種很糟糕的形式,因爲這會導致遠程用戶中斷。在這種用法中,Web瀏覽器將文件數據上傳到服務器,並將其傳遞給Django,該Django創建UploadedFile來處理它。簡單地將該文件複製到磁盤,你需要像代碼:

def handle_uploaded_file(f): 
    destination = open('path/to/store/at/' + f.name, 'wb+') 
    for chunk in f.chunks(): 
     destination.write(chunk) 
    destination.close() 

如果你不想使用上傳的名稱,用別的除了f.name。如果要在上傳的文件上運行命令,請先將其保存在某處(可能位於臨時文件中),然後使用subprocess.Popen運行該命令。

+0

好的,謝謝我將使用類似這樣的命令或腳本在上傳的文件上運行: def handle_uploaded_file(f): destination = open('/ home /.../ file。TXT ' 'WB +') 爲塊中f.chunks(): destination.write(塊) destination.close() P = subprocess.Popen([' ./的MyScript ''/家庭/。 ../file.txt','arg','arg'])抱歉,我無法回答自己的問題,因此代碼會被格式化 – Bigdinrock 2011-04-15 23:11:42