繁体   English   中英

如何通过python子进程调用执行Perl脚本?

[英]How to execute a perl script through python subprocess call?

我正在python中使用subprocess.call ,试图运行一个perl脚本,该脚本在远程计算机上运行代码以获取一些信息。

我在机器A上有两个脚本-python和perl。 python脚本使用subprocess.call方法通过循环传递IP地址来调用perl脚本。 两种脚本都可以正常运行。

但是,perl脚本以串行顺序执行(一个IP接一个IP)。

# python code

def foo():
   print()
   IPs = ["198.168.1.2","198.168.3.4"]
   for ip in IPs:
       proc = call("perl script.pl '%s'" %ip, shell=True, stdin=PIPE)

foo()
   # perl script
   #!/usr/bin/perl

   sub bar($)
   {
      //Code that ssh's to a remote-machine and gets required information
   }

   print(bar($ARGV[0]),"\n");  
   print("Sleeping for 15 sec\n");
   sleep(15);
   print("Done\n");

实际行为-

  • python脚本通过传递'198.168.1.2'来运行perl脚本
  • perl脚本执行代码并休眠15秒
  • 然后,python脚本通过传递'198.168.3.4'来运行perl脚本
  • perl脚本执行代码并休眠15秒

因此,两个IP都需要总共30秒才能运行perl脚本。

预期行为-

  • python脚本通过传递'198.168.1.2'来运行perl脚本
  • 它不等待perl脚本以第一个IP结尾,而是以“ 198.168.3.4”执行相同的perl脚本。

因此,对两个IP执行perl脚本所花费的时间大致相同。

这可以通过subprocess.Popen完成。 这将在不阻塞主线程的情况下运行该进程。 您将看起来像这样:

def foo():
    print()
    IPs = ["198.168.1.2","198.168.3.4"]
    procs = []
    for ip in IPs:
        proc = subproces.Popen(["perl", "script.pl", ip], shell=True, stdin=PIPE)
        procs.append(proc)

    # wait for all the processes to finish
    for proc in procs:
        proc.wait()

foo()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM