我正在尝试通过子进程模块将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"> </td>
<td><input type="submit" value="Submit">
<input type="Reset" value="Clear Form">
</td>
</tr>
</table>
</fieldset>
</form>
ex.pl
#!/usr/bin/perl
$|=1; # Flush immediately.
print "Content-Type: text/plain\n\n";
read STDIN, $form, $ENV{'CONTENT_LENGTH'};
foreach $pair (split('&', $form)) {
if ($pair =~ /(.*)=(.*)/) { # found key=value;
($key, $value) = ($1, $2); # get key, value.
$value =~ s/\+/ /g; # substitute spaces for + signs.
$value =~ s/%(..)/pack('c',hex($1))/eg;
$inputs{$key} = $value; # Create Associative Array.
}
}
foreach $item (keys(%inputs)) {
print "$item - $inputs{$item}\n";
}
答案 0 :(得分:0)
您提供的Perl脚本是一个基本的CGI脚本。
正如任何提到的那样,它期望来自STDIN的数据。
但$ENV{CONTENT_LENGTH}
大小。
如果你想得到这个Perl脚本的任何输出,你应该uri-escape所有数据,加入所有键及其值usung'='字符然后使用'&amp;'加入对字符。
然后将环境变量CONTENT_LENGTH
设置为您获得的字符串的长度,运行ex.pl并将数据打印到它的标准输入。
以下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编码器。