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

时间:2019-07-11 02:43:34

标签: python multithreading subprocess

我在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的perl脚本总共需要30秒。

预期的行为-

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

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

1 个答案:

答案 0 :(得分:0)

这可以通过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()