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, я обнаружил это , но все равно не смог решить мою проблему. Надеюсь, это кому-нибудь поможет.