【问题标题】:Struggling with Python's subprocess.Popen running a Perl script挣扎于 Python 的 subprocess.Popen 运行 Perl 脚本
【发布时间】:2014-10-08 19:46:31
【问题描述】:

我有一个需要用 Python 运行的 Perl 脚本,我一直在尝试使用 subprocess 来完成它,但没有成功。我可以让命令在命令行上正常运行,但子进程无法让它工作。

如果我有这样的 Perl 脚本:

#!/usr/bin/perl

use strict;
use warnings;

my $name = shift;

print "Hello $name!\n";

我能够像这样在命令行上成功运行命令

C:\current\path> perl test.pl world
>>>Hello world!

但是当我尝试使用子进程调用相同的命令时,我得到了这个错误

cmd = 'perl test.pl world'
pipe = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE)
>>>"'perl' is not recognized as an internal or external command, operable program or batch file."

我尝试了将 cmd 创建为列表的不同组合

cmd = ['perl','test.pl','world']

以及给子进程 Perl 的绝对路径

cmd = ['C:\path\to\perl.exe','test.pl','world']

但没有任何东西可以让它工作。没有 Perl,我可以让子进程正常运行

pipe = subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)
pipe.stdout.read()
>>>Volume in drive C is Windows7_OS....

我绝对确定 Perl 在我的 PATH 中,因为就像我说的那样,我可以在命令行中很好地调用该命令。我查看了建议检查os.environ["COMSPEC"] 的不同帖子,将Perl 添加到子进程环境中,但没有任何效果。

编辑:我也无法让该命令与任何其他子进程方法一起使用:check_output() 返回一个空字节字符串,call() 返回 1。

我们将不胜感激任何形式的修复或替代解决方案。我在 Windows 7 64 位上运行 Python 3.4。我也尝试过 32 位和 64 位 Python,但无济于事。


更新: 我已经能够让它在 Mac 上运行,但有一个区别:我不能拥有 shell=True。除此之外,我想要的任何subprocess 函数都可以使用,包括Popencheck_outputcall

所以我想这是一个 Windows 问题。我试过不在我的 Windows 机器上设置shell=True,但我总是收到这个错误:

WindowsError: [Error 193] %1 is not a valid Win32 application

更新 2: 我也尝试创建一个运行该命令的 .bat 文件,但我也遇到了同样的错误,我尝试只调用 Perl。

pipe = subprocess.Popen('test.bat',shell=True,stdout=subprocess.PIPE)
>>>"'test.bat' is not recognized as an internal or external command, operable program or batch file."

test.bat 只有一行:

echo Hello, World

【问题讨论】:

    标签: python perl subprocess windows-7-x64


    【解决方案1】:

    您可以尝试改用 os.system('command')。显然,由于某种原因,它没有得到很好的评价,或者至少不像子过程那样受到重视。或者,您可以尝试其他一些子流程方法,例如 call、check_call 或 check_output。过去我在使用 Popen 时遇到过类似的问题,切换到其中一种方法会有所帮助。

    【讨论】:

    • 我可能应该提到没有一个子流程方法也适用于 Perl。 check_output 返回一个空字节字符串,调用总是返回 1。不过我会尝试 os.system()。
    • 看起来 os.system(cmd) 也没有削减它。仍然返回退出代码 1 :/
    【解决方案2】:

    我在尝试从 Python 运行 perl 脚本时遇到了同样的错误。

    我设法通过将 perl.exe 的完整路径(带有额外的转义字符,如“\”)添加到我尝试运行的命令中来使其工作,如下所示:

    pipe = subprocess.Popen('C:\\Perl64\\bin\\perl myscrip.pl',shell=True,stdout=subprocess.PIPE)
    pipe.stdout.read()
    

    【讨论】:

      【解决方案3】:

      这对我来说很好。我知道已经有一段时间了,事情可能刚刚好转。

      我正在使用 activestate perl 5.8.9
      和 Windows 10 上的 python 3.9.5。

      from subprocess import Popen, PIPE
      
      proc = Popen(['perl', 'test.pl', 'world'], stdout=PIPE, stderr=PIPE)
      stdout, stderr = proc.communicate()
      
      if proc.returncode == 0:
          print(stdout.decode())
      else:
          print(stderr.decode())
      

      【讨论】:

        猜你喜欢
        • 2023-04-06
        • 2014-08-30
        • 1970-01-01
        • 1970-01-01
        • 2021-08-26
        • 2021-02-02
        • 2015-08-24
        • 2021-08-05
        • 2012-01-06
        相关资源
        最近更新 更多