PHP — передача JSON в скрипт Python

У меня есть этот массив в моем 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)

Что я делаю неправильно?

Где php-код кодирует json?

Marcin Orlowski 10.05.2019 08:34

@MarcinOrlowski Ах, извините, забыл включить это! Я обновил свой вопрос с помощью $json, который передается скрипту Python.

oliverbj 10.05.2019 08:35

Теперь добавьте код, который вызывает скрипт Python. Я на 100% уверен, что вы делаете это неправильно, без надлежащего побега и в конечном итоге укусите кавычки.

Marcin Orlowski 10.05.2019 08:36

В вашем вопросе нет ничего, что указывало бы на то, что вы даже пытались отладить свой код. У вас есть?

Andreas 10.05.2019 08:37

@MarcinOrlowski Обновил мой вопрос о том, как я вызываю свой скрипт.

oliverbj 10.05.2019 08:38

Именно так, как я и предсказывал. Здесь: php.net/manual/en/function.escapeshellarg.php

Marcin Orlowski 10.05.2019 08:41

@MarcinOrlowski - Спасибо! Я понятия не имел, что должен это сделать. Теперь он работает отлично.

oliverbj 10.05.2019 08:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
7
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме