1

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

我在机器 A 上有两个脚本——python 和 perl。python 脚本使用subprocess.call方法调用 perl 脚本,方法是在循环中将 IP 地址传递给它。两个脚本都运行得很好。

但是,perl 脚本是按串行顺序执行的(一个 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 脚本所花费的时间或多或少是相同的。

4

1 回答 1

1

这可以通过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()
于 2019-07-11T02:59:09.027 回答