Как выполнить скрипт perl через вызов подпроцесса python? - PullRequest
0 голосов
/ 11 июля 2019

Используя subprocess.call в python, я пытаюсь запустить Perl-скрипт, который запускает код на удаленных машинах для получения некоторой информации.

У меня есть два скрипта на машине A - python и perl.Скрипт python вызывает скрипт perl, используя метод subprocess.call, передавая ему 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 запускает сценарий perl, передавая '198.168.1.2'
  • Сценарий perl выполняет код и спит в течение 15 секунд
  • Затем сценарий pythonзапускает perl-скрипт, передавая '' 198.168.3.4 '
  • perl-скрипт выполняет код и спит 15 секунд

Следовательно, для запуска сценария perl требуется 30 секунд для обоихIP.

Ожидаемое поведение -

  • Скрипт python запускает скрипт perl, передавая "198.168.1.2"
  • вместо ожиданиядля завершения сценария perl с первого IP-адреса он выполняет тот же сценарий perl с «198.168.3.4».

Следовательно, время, затрачиваемое на выполнение сценария perl для обоих IP-адресов, более или менее равното же самое.

1 Ответ

0 голосов
/ 11 июля 2019

Это можно сделать с помощью 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...