Как запустить процесс, аргумент которого содержит новые строки?

#python-3.x #subprocess #quoting

#python-3.x #подпроцесс #цитирование

Вопрос:

У меня есть команда, которая имеет структуру :
xrdcp "root://server/file?authz=ENVELOPEamp;Param1=Val1" local_file_path
Проблема в том, что КОНВЕРТ в тексте, который не должен заключаться в кавычки в командной строке и содержит много новых строк, я не могу использовать repr, поскольку он заменит новую строку на n Более того, подпроцесс, похоже, автоматически использует repr для элементов из списка аргументов

В bash эта команда обычно выполняется с
xrdcp "root://server/file?authz=$(<ENVELOPE)amp;Param1=Val1" local_file

Итак, есть ли способ запустить команду, сохранив новые строки в аргументах?
Спасибо!

Последующее редактирование:
мой фактический код :

 envelope = server['envelope']
complete_url = """   server['url']   "?"   "authz="   "{}".format(server['envelope'])   xrdcp_args   """
xrd_copy_list = []
xrd_copy_list.extend(xrdcp_cmd_list)
xrd_copy_list.append(complete_url)
xrd_copy_list.append(dst_final_path_str)
xrd_job = subprocess.Popen(xrd_copy_list, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = xrd_job.communicate()
print(stdout)
print(stderr)
  

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

1.Что вы подразумеваете под «он преобразует новые строки»? n является символом новой строки. Что именно преобразуется во что? Интересно, нужно ли вам указывать ваш URL в процентах, чтобы новые строки были преобразованы. Попробуйте что-то вроде envelope = urllib.parse.quote(server['envelope']) .

2. Если это не сработает, пожалуйста, укажите именно то, что вы ожидаете, чтобы командная строка выглядела именно так, как server['envelope'] выглядит (разумеется, с удалением любой конфиденциальной информации).

3. я имел в виду, что новые строки преобразуются в литерал » n» и тем самым изменяют строку, которая отправляется на сервер в URL. я посмотрю urllib.parse.quote, большое спасибо!

4. итак, я нашел обходной путь: я создал файл metalink с URL-адресами, указанными в CDATA, и я мог бы использовать metalink для загрузки файлов. в metalink я просто использовал write({}.format(url))