2011-04-15 62 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