0

我正在尝试通过 sub-process module 将 key:value 对发送到 perl 脚本。我只是尝试了一个简单的例子,它工作正常。如何将键:值对传递给 perl 脚本.....?

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

视图.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>

#!/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"; 
}
4

1 回答 1

0

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

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

如果你想得到这个 Perl 脚本的任何输出,你应该对所有数据进行 uri 转义,使用 '=' 字符连接所有键及其值,然后使用 '&' 字符连接对。

然后将环境变量设置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 编码器。

于 2012-10-17T14:40:06.587 回答