#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))