Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过python子进程调用执行perl脚本?_Python_Multithreading_Subprocess - Fatal编程技术网

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

如何通过python子进程调用执行perl脚本?,python,multithreading,subprocess,Python,Multithreading,Subprocess,使用python中的subprocess.call,我试图运行一个perl脚本,它在远程机器上运行一个代码来获取一些信息 我在机器A上有两个脚本—python和perl。python脚本使用subprocess.call方法调用perl脚本,方法是在循环中向其传递IP地址。两个脚本都运行得很好 但是,perl脚本是以串行顺序执行的(一个IP接一个IP) 实际行为- python脚本通过传递'198.168.1.2'来运行perl脚本 perl脚本执行代码并休眠15秒 python脚本然后通过传

使用python中的
subprocess.call
,我试图运行一个perl脚本,它在远程机器上运行一个代码来获取一些信息

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

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

实际行为-

  • 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脚本所花费的时间大致相同。

这可以通过
subprocess.Popen
实现。这将在不阻塞主线程的情况下运行进程。您的应用程序将如下所示:

def foo():
打印()
IPs=[“198.168.1.2”,“198.168.3.4”]
过程=[]
对于ip中的ip:
proc=subproces.Popen([“perl”,“script.pl”,ip],shell=True,stdin=PIPE)
过程追加(proc)
#等待所有进程完成
对于进程中的进程:
进程等待()
foo()

谢谢您的回答。我不知道为什么,但是
proc=subproces.Popen([“perl”,“script.pl”,ip],shell=True,stdin=PIPE)
不起作用。但是,
proc=Popen(“perlscript.pl'%s'%ip,shell=True,stdin=PIPE)
worked.Huh。可以无论如何,请你把我的答案标记为正确是公平的吗@爱尔兰共和军
# 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");