#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
аргумент для передачи его в качестве аргумента.
Обратите внимание, что вам может быть лучше передать данные в другой процесс, поскольку их так много.