Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 试图通过子流程模块将键值对传递给perl脚本_Django_Perl - Fatal编程技术网

Django 试图通过子流程模块将键值对传递给perl脚本

Django 试图通过子流程模块将键值对传递给perl脚本,django,perl,Django,Perl,我试图通过子进程模块将key:value对发送到perl脚本。我只是尝试了一个简单的例子,效果很好。如何将key:value对传递给perl脚本 Ans还可以如何将多个输入字段值发送到perls脚本>下面是我的代码 view.py from django.http import HttpResponseRedirect, HttpResponse from django.shortcuts import get_object_or_404, render_to_response from dja

我试图通过子进程模块将key:value对发送到perl脚本。我只是尝试了一个简单的例子,效果很好。如何将key:value对传递给perl脚本

Ans还可以如何将多个输入字段值发送到perls脚本>下面是我的代码

view.py

from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import get_object_or_404, render_to_response
from django.template import RequestContext
from subprocess import Popen, PIPE, sys
import subprocess 

def ex(request):
   myName = 'Pervez'
   if 'firstname' in request.POST:
     myName = (request.POST['firstname'])
   p = Popen(['/home/pervez/Desktop/simplepage/simplepage/templates/ex.pl', myName],stdin=PIPE, stdout=PIPE)
    p.stdin.close()
    result = p.stdout.read()
return render_to_response('ex.html', {'name': result},context_instance=RequestContext(request))
ex.html

{{ name }}
<FORM METHOD="POST" ACTION="" NAME="SIGNUPFORM">
{% csrf_token %}
<fieldset>
<legend>Signup Form</legend>
<table>
<tr><td>First Name</td><td><INPUT SIZE=20 NAME="firstname"> </td></tr>
<tr><td>Last Name</td><td><INPUT SIZE=20 NAME="lastname"></td></tr>
<tr><td>User Name</td><td><INPUT SIZE=20 NAME="username"></td></tr>
<tr><td>Password</td><td><INPUT SIZE=20 NAME="password"></td></tr>
<tr><td>Verify Password</td><td><INPUT SIZE=20 NAME="vpass"></td></tr>
<tr><td>Your E-mail</td><td><INPUT SIZE=20 NAME="email_id"></td></tr>
<tr><td align="right">&nbsp;</td>
<td><input type="submit" value="Submit">
    <input type="Reset" value="Clear Form">
</td>
</tr>
</table>
</fieldset>
</form>

您提供的Perl脚本是一个基本的CGI脚本

正如anydot所提到的,它需要来自STDIN的数据。 但是是
$ENV{CONTENT\u LENGTH}
大小

如果您想获得这个Perl脚本的任何输出,您应该uri转义所有数据,使用“=”字符连接所有键及其值,然后使用“&”字符连接对

然后将环境变量
CONTENT\u LENGTH
设置为您获得的字符串的长度,运行ex.pl并将数据打印到它的stdin中

下面的Python代码可以做到这一点:

from subprocess import Popen, PIPE
import os

os.environ["CONTENT_LENGTH"]="26";

p = Popen(['./ex.pl'], stdin=PIPE, stdout=PIPE);
p.stdin.write('foo=bar&baz=var+with+space\n');

p.stdin.close();
result = p.stdout.read();

print(result);

可能是脏的,但我不是Python程序员。

您的perl脚本接受STDIN上的数据,而您在Python脚本中关闭STDIN,而不发送任何数据,这就是它没有输出任何数据的原因。
from subprocess import Popen, PIPE
import os

os.environ["CONTENT_LENGTH"]="26";

p = Popen(['./ex.pl'], stdin=PIPE, stdout=PIPE);
p.stdin.write('foo=bar&baz=var+with+space\n');

p.stdin.close();
result = p.stdout.read();

print(result);