PHP system () завершается с ошибкой при вызове скрипта python, который обрабатывает файл с кодировкой UTF-8 - PullRequest
0 голосов
/ 29 октября 2019

Tl; dr: Подумайте об использовании Python-фреймворка Bottle вместо PHP. Если вы не можете, у меня есть ссылка на решение для python2 внизу этого поста.

Я сделал простую программу на python для цепочки markov. Он работает с двумя списками слов greek.txt и japanese.txt. Обратите внимание, что japanese.txt содержит символ Ō, но проблема сохраняется, даже когда я заменил символы обычными O.

Я хочу сделать действительно простой, маленький и грязный PHP API.

Когда я вызываю PHP-файл, он должен отображать вывод команды python3 markov-chain.py $_GET['file'] 10 $_GET['min'] $_GET['max'].

У меня есть это:

<?php
if(isset($_GET["file"]) && isset($_GET["min"]) && isset($_GET["max"])) {
    if($_GET["file"] != null && $_GET["min"] != null && $_GET["max"] != null && is_numeric($_GET["min"]) && is_numeric($_GET["max"])) {
        # Yeah, it should be fine. Just check for $file in whitelist
        $filename = $_GET["file"];
        $min_len = $_GET["min"];
        $max_len = $_GET["max"];
        $count = 10;
        if( $filename === "japanese.txt" || $filename == "greek.txt" ) {
            $command = 'python3 markov-chain.py ' . $filename . ' ' . $count . ' ' . $min_len . ' ' . $max_len;
            echo($command);
            echo(system($command, $statuscode));
            echo('S:'.$statuscode);
            echo('E:'.error_get_last());
        }
    }
}
?>

Когда я вызываю это в списке слов greek.txt, всеработает как положено. Однако, когда я вызываю его на japanese.txt, код состояния 1 и ничего не отправляется на вывод system(). Когда я копирую и вставляю сгенерированную команду в терминал, она работает без проблем даже для варианта japanese.txt.

Я пытался создать файл test.sh, который имел бы жестко закодированные аргументы:

#!/bin/sh
python3 markov-chain.py greek.txt 10 3 6 2>> errorlog.txt

Когда я вызываю этот файл из PHP, он работает. Однако, когда я изменяю файл test.sh для работы со списком слов japanese.txt, я все равно ничего не получаю в качестве вывода и 1 в качестве кода состояния. Вызов test.sh из терминала прекрасно работает для обоих вариантов (греческого и японского). Ничего не записывается в файл журнала ошибок (файл даже не создается!), Когда я вызываю test.sh из PHP.

греческий список слов
японский список слов

Редактировать:

Греческий список слов - ASCII, а японский список слов - UTF-8, поэтому PHP не принимает (или Python неправильно отправляет) кодировку UTF-8.

Редактировать:

Не совсем решение, но в итоге я перешел на Python framework Bottle , именно поэтому я использовал PHP: я просто записал его в один файл и он... работает. Отлично подходит для простых API, мне просто нужно быстро взломать вместе.

Что касается проблемы с UTF-8, я обнаружил это , но все равно не смог решить мою проблему. Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...