У меня есть этот массив в моем PHP:
$coordinates[] = [
1 => [
'x' => 300,
'y' => 200,
'w' => 400,
'h' => 500,
]
];
$coordinates[] = [
2 => [
'x' => 350,
'y' => 100,
'w' => 400,
'h' => 500,
]
];
//Convert the array to JSON
$json = json_encode($coordinates);
//Invoke the python script:
$process = new Process("python3 /MyFile.py {$json}");
$process->run();
Каждый массив представляет собой определенную страницу с определенными координатами.
Я хочу отправить их в скрипт Python через интерфейс командной строки. В моем скрипте Python я получаю это так:
import sys
import json
COORDINATES_JSON = sys.argv[1] if len(sys.argv) > 1 else None
COORDINATES = json.loads(COORDINATES_JSON)
Однако это дает мне следующую ошибку:
Error Output:
================
sh: sysctl: command not found
Traceback (most recent call last):
File "MyPyFile.py", line 5, in <module>
COORDINATES = json.loads(COORDINATES_JSON)
File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/__init__.py", line 348, in loads
return _default_decoder.decode(s)
File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py", line 353, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 3 (char 2)
Что я делаю неправильно?
@MarcinOrlowski Ах, извините, забыл включить это! Я обновил свой вопрос с помощью $json, который передается скрипту Python.
Теперь добавьте код, который вызывает скрипт Python. Я на 100% уверен, что вы делаете это неправильно, без надлежащего побега и в конечном итоге укусите кавычки.
В вашем вопросе нет ничего, что указывало бы на то, что вы даже пытались отладить свой код. У вас есть?
@MarcinOrlowski Обновил мой вопрос о том, как я вызываю свой скрипт.
Именно так, как я и предсказывал. Здесь: php.net/manual/en/function.escapeshellarg.php
@MarcinOrlowski - Спасибо! Я понятия не имел, что должен это сделать. Теперь он работает отлично.






Вы можете использовать escapeshellarg($json), как предложено в комментариях.
// Invoke the python script:
$json = escapeshellarg($json);
$process = new Process("python3 /MyFile.py {$json}");
$process->run();
Или вы можете поместить json в файл и получить его в python.
file_put_contents('json_file.json', $json);
Вы также можете хранить свой json в памяти, базе данных или другими способами, но я бы посоветовал придерживаться первого варианта выше.
Где php-код кодирует json?