Как проверить фактический список аргументов, передаваемых в подпроцесс.Обработчик процесса Popen?

#python #python-3.x #subprocess #popen

#python #python-3.x #подпроцесс #popen

Вопрос:

Я использую Python и использую subprocess.Popen для вызова системного вызова. Я передаю довольно длинную строку, т.Е. self.description Значение, под subprocess.Popen аргументом, как показано ниже.

 firstProcess = subprocess.Popen(["echo",self.description], stdout=subprocess.PIPE)
 

Однако я получаю эту ошибку, которая гласит: Argument list too long

   File "/usr/lib/python3.5/subprocess.py", line 1551, in _execute_child
    raise child_exception_type(errno_num, err_msg)
OSError: [Errno 7] Argument list too long
 

Некоторое время приведенный выше код работает, а иногда он не будет работать в зависимости от содержимого 'self.description' строки.

Как я могу заставить приведенный выше код работать, заставляя subprocess.Popen рассматривать self.description его как одну единственную строку ИЛИ как я могу распечатать список значений параметров, которые фактически передаются subprocess.Popen(["echo",self.description] методу, поскольку кажется self.description , что он разделяется на несколько параметров и передается subprocess.Popen методу?

Комментарии:

1. Если self.description содержит пробелы, вы должны заключить строку в двойные кавычки ( " ). символы.

2. можете ли вы распечатать (для нас) содержимое self.description ? Вероятно, это неправильно отформатировано для popen

3. Размер данных составляет около 200 Кб. Некоторые примеры данных: F 24 U: 0 Pi: 1 G: 22 E: 462 H: 0 A: A stat (id 384 val 0x0000000002CC908F) P: 00000004 I2: -ba-классификация F 24 U: 0 Pi: 1 G: 22 E: 464 H: 0 A: Aстатистика (id 386 val 0x0000000000001224) P: 00000004 I2: -ba-классификация F 24 U: 0 Pi: 1 G: 22 E: 494 H: 0 A: Статистика DPP (id 416 val 0x0000000004A07F7E) P: 00000002 I2: -ba-классификация F 24 U: 0 Pi: 1G: 22 E: 508 H: 0 A: статистика DPP (id 430 val 0x000000000004F5A7) P: 00000002 I2: -ba-классификация

4. @martineau Как я могу убедиться, что каждая вещь внутри строки правильно экранируется и обрабатывается как одна большая строка, а не пара строк со случайными разделителями.

Ответ №1:

Я думаю, вы могли бы использовать функцию shlex.quote(), чтобы правильно указать self.description аргумент для передачи его в качестве аргумента.

Обратите внимание, что вам может быть лучше передать данные в другой процесс, поскольку их так много.