subprocess.Popen или proc.stdout.read (), повреждающий данные JSON - PullRequest
0 голосов
/ 25 июня 2018

Я запускаю PHP-скрипт через Python Django, так как он содержит устаревший код для клиента.

Данные передаются в скрипт PHP через JSON, и после того, как скрипт вычислен, строка возвращается для отображения следующим образом.

proc = subprocess.Popen(["php -f script.php " + json.dumps(data_for_php, sort_keys=True)], shell=True, stdout=subprocess.PIPE)
script_response = proc.stdout.read()
return HttpResponse(script_response)

У меня проблема с повреждением данных.

т.е. одно поле JSON из data_for_php имеет ключ и значение 'xxx_amount': u'$350,000.00', возвращает ,000.00, в качестве значения в script_response.

Он не делает это ни для чего другого.

Я провел небольшую отладку и определил, что json.dumps(data_for_php, sort_keys=True) не вызывает проблемы, также data_for_php тоже хорошо.

Это заставляет меня поверить, что эта команда proc.stdout.read() как-то мутирует $350 в (пробел).

Примечание: то же самое происходит и для других значений словаря.

Обновление

Меня убеждают, что процесс, который я использую, представляет собой скрипт командной строки внутри Python. Когда команда вызывается, переменные JSON передаются внутри сценария командной строки. Это, вероятно, проблема. Ищем решение.

1 Ответ

0 голосов
/ 25 июня 2018

$350 в bash - это переменная, в оболочке она заменяется своим значением, которое не определено. Добавление одинарной кавычки к дампу должно помочь избежать интерпретации специальных символов:

proc = subprocess.Popen(["php -f script.php '" + json.dumps(data_for_php, sort_keys=True) + "'"], shell=True, stdout=subprocess.PIPE)
script_response = proc.stdout.read()
return HttpResponse(script_response)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...