2011-01-13 182 views
9

我有一个Perl脚本,我想从Python脚本调用。我一直在寻找,并没有成功。我基本上试图调用Perl脚本发送一个变量给它,但不需要Perl脚本的输出,因为它是一个自包含的程序。从Python调用Perl脚本

我想出到目前为止是:

var = "/some/file/path/" 
pipe = subprocess.Popen(["./uireplace.pl", var], stdin=subprocess.PIPE) 
pipe.stdin.write(var) 
pipe.stdin.close() 

才刚刚起步Python编程,所以我敢肯定,上面是总废话。任何帮助将非常感激。

回答

7

如果你只是想打开一个管道,一个Perl解释器,您在正确的轨道上。我认为你唯一缺少的是perl脚本本身不是可执行文件。所以你需要这样做:

var = "/some/file/path/" 
pipe = subprocess.Popen(["perl", "./uireplace.pl", var], stdin=subprocess.PIPE) 
pipe.stdin.write(var) 
pipe.stdin.close() 
1

我希望this可以帮助你。否则不知道该怎么做。

+0

谢谢你的参考...它是由activestate创建和支持..他们似乎放弃了它? – Tagar 2016-03-08 01:18:02

1

你想通过var作为参数,在标准输入或两者?通过它作为参数,使用

subprocess.call(["./uireplace.pl", var]) 

到管它STDIN,使用

pipe = subprocess.Popen("./uireplace.pl", stdin=subprocess.PIPE) 
pipe.communicate(var) 

两个代码段需要uireplace.pl为可执行。如果不是,你可以使用

pipe = subprocess.Popen(["perl", "./uireplace.pl"], stdin=subprocess.PIPE) 
pipe.communicate(var) 
2

你可以尝试subprocess.call()方法。它不会返回您正在调用的命令的输出,而是返回代码以指示执行是否成功。

var = "/some/file/path" 
retcode = subprocess.call(["./uireplace.pl", var]) 
if retcode == 0: 
    print("Passed!") 
else: 
    print("Failed!") 

确保你的Perl脚本是可执行的。否则,您可以在您的命令Perl解释器(像这样):

subprocess.call(["/usr/bin/perl", "./uireplace.pl", var]) 
15

只是做:

var = "/some/file/path/" 
pipe = subprocess.Popen(["perl", "uireplace.pl", var]) 
+1

请注意:由于OP表示他不想获得输出,因此不需要“Popen”。使用`subprocess.call`或`subprocess.check_call`更好。 – user225312 2011-01-13 16:11:33

+3

@sukhbir:我认为当OP说他不需要输出时,我也可以“假设”他也不想等到perl脚本完成哪个子进程调用或子进程。 check_call`确实:) – mouad 2011-01-13 16:14:01