1

При попытке выполнить следующий код, я получаюPython многопроцессорной с подпроцесс Флаги не запуститься

OSError: [Errno 2] No such file or directory

Странная проблема в том, что, когда я пытаюсь запустить LS без каких-либо других флагов, таких как -a, подпроцесс перспективе как предполагалось, без ошибок. Я также попытался добавить shell = True вместе с флагом -a, но все равно не повезло.

from multiprocessing import * 
import subprocess 


class ThreadManager: 
    def __init__(self, tools): 
     self.tools = tools 
     self.pool_size = cpu_count() 
     self.p1 = Pool(processes=self.pool_size, maxtasksperchild=2,) 

    def initiate(self): 
     for self.tool in self.tools: 
      print self.tool 
      self.p1 = Pool(4) 
      self.p1 = Process(target=subprocess.call, args=(self.tool,)) 
      print self.p1 

      self.p1.start() 

th = ThreadManager("ls -a".split("/")) 
th.initiate() 
+0

'subprocess.call' должен быть вызван с помощью' оболочки = true' работать с ' "LS -a"' или иметь список аргументов, передаваемых как '["/bin/ls "," -a "]'. Почему вы используете 'split ("/")' – myaut

+0

Я использую 'split ("/")', потому что результат, который я получаю при его запуске, равен 'l s - a' Он разбивает целые строковые символы. Кажется, я не могу заставить shell = True работать. Другими словами, выполняется это 'Процесс (target = subprocess.call, args = (self.tool, shell = True))' Результаты в ** Невозможно назначить функцию для вызова ** –

+0

Поскольку 'shell = True' является аргумент _keyword_ (_kwarg_), в то время как 'args' принимает кортеж _postional arguments_. Вы должны попытаться использовать 'kwargs = dict (shell = True)' для передачи его в 'Process' или просто использовать' .split() ', который превращает' 'ls -a''' в' ["ls", "-a "]' – myaut

ответ

0

Ваша проблема здесь:

"ls -a".split("/") 

Это превращает его в список ["ls -a"], который заставляет subprocess.call(), чтобы найти исполняемый файл с именем "Ls -a", который не существует. subprocess.call() можно назвать два способов:

subprocess.call("ls -a", shell=True) # argument parsing is done by shell 
subprocess.call(["ls", "-a"])   # argument parsing not needed 
subprocess.call("ls -a".split())  # argument parsing is done via .split() 
subprocess.call(shlex.split("ls -a")) # a more reliable approach to parse 
             # command line arguments in Python 

Обратите внимание, что первый аргументом subprocess.call() является позиционной аргумент и передается как args кортежа, в то время как shell=True является ключевого слова аргумент а и должен передается в качестве аргумента словарь kwargs:

Process(target=subprocess.call, args=("ls -a",), kwargs=dict(shell=True)) 
Process(target=subprocess.call, args=(["ls", "-a"],)) 
Смежные вопросы