2016-12-28 4 views
1

Ich habe ein PHP-Skript, das mit einer Datenbank verbunden ist. Die Idee hinter dem folgenden Array ist, dass diese Information in die Datenbank eingefügt wird. Die Kategorie muss durch einen ML-Algorithmus festgelegt werden, für den ich textblob für Python verwende. Ich benutze das Codeigniter-PHP-Framework.Ausführen eines Python-Programms mit Parametern und Verwendung des Ergebnisses als PHP-Variable? (CodeIgniter, TextBlob, Python 3.4, PHP 7)

$temp = $this->input->post('issue'); 
$data = array(
    'priority' => '1', 
    'Summary' => $this->input->post('issue'), 
    'status' => 'Submitted', 
    'category' => exec("python machineLearning.py .$temp"), 
    'itemsRequired' => ' ', 
    'lastUpdate' => date('Y-m-d G:i:s'), 
    'ownerID' => $this->session->userdata('username'), 
    'managerID' => 'tech' 
); 

Das Python-Skript (machineLearning.py) funktioniert problemlos, wenn es selbst aufgerufen wird. Der Fehler, den ich bekomme, ist, dass die Kategorie derzeit als eine leere Zeichenfolge übrig ist. Ich habe versucht, einen Test zu verwenden mit:

exec("python machineLearning.py idCard", $output); 
print_r($output); 

Aber das Ergebnis ist nur ein leeres Array:

Array()

Das Python-Programm hat die Maschine innerhalb einer Funktion Lernen benannte machineLearning und nimmt einen Parameter mit dem Namen issue. Ich brauche den Wert von

$this->input->post('issue') 

in die Maschinelles Lernen-Funktion im Python-Programm zu übergeben. Übergebe ich die Parameter falsch oder benötigt die Funktion exec() den korrekten Pfad zum Programm? Danke allen.

LÖSUNG GEFUNDEN

Eine Kombination der beiden aktuellen Argumente hat das Problem gelöst, ich hatte meinen Weg in die Datei zu aktualisieren, innerhalb der exec() Funktion, und aktualisieren Sie den Parameterbereich des exec function(), musste aber zusätzlich die if-Anweisung vorschlagen. Vielen Dank für Ihre Hilfe

+0

Ich würde sehr empfehlen, Benutzereingaben zu entgehen/zu bereinigen, bevor Sie sie in einem Shell-Befehl verwenden. Im Moment könnte jemand ein bösartiges Problem wie '; rm -Rf .' – Devon

+0

@Devon Ich habe davon gehört, aber ich arbeite gerade daran, das so einfach zu machen. Wie wäre ich jedoch in Bezug auf diese Frage? –

+0

Es gibt eine Funktion in PHP dafür, EscapeShellarg, die sich als nützlich erweisen sollte. – Devon

Antwort

0

Sie müssen ein "main" für Ihr Python-Skript haben, das den Parameter von der Befehlszeile liest und Ihre Funktion aufruft. Etwas wie:

if __name__ == "__main__": 
    YourFunction(sys.argv[1]) 

Maeby fügen Sie etwas Entschuldungscode hinzu, um Ihre Argumente zu drucken. Über den Pfad zur ausführbaren Datei, wenn die PATH-Umgebung korrekt in Ihrem PHP (Ihr Server?) -Kontext festgelegt ist, um den Pfad zu Python zu enthalten, brauchen Sie nicht den vollständigen Pfad zu Ihrer Exe.

1

Es sieht so aus, als ob Sie wahrscheinlich eine Fehlerbedingung haben und daher keine gültigen Daten von exec erhalten. Versuchen Sie, 2>&1 der Aufruf- und Debugausgabe hinzuzufügen. Zum Beispiel lokal, versuche ich, und ich bekomme:

exec("python machineLearning.py idCard 2>&1", $output); 
print_r($output); 


Array 
(
    [0] => /usr/bin/python: can't open file 'machineLearning.py': [Errno 2] No such file or directory 
) 

Sie könnten speziell wollen zu dem absoluten Pfad zur Datei in Ihrem Anruf codieren. Dies würde den obigen "Datei nicht gefunden" -Fehler beheben.

exec("python /path/to/machineLearning.py idCard 2>&1", $output); 
+0

Ein bisschen Verzögerung beim Zurückkommen, Entschuldigung dafür, aber können Sie bitte den '2> & 1' Teil erklären? Ich habe mich irgendwie umgesehen, kann aber nicht verstehen, warum es notwendig ist? –

+0

Es heißt Umleitung. Grundsätzlich können Sie alle Nachrichten erfassen, die aus Ihrem Python-Skript stammen, anstatt nur STDOUT. http://unix.stackexchange.com/questions/99263/what-does-21-in-this-command-mean – cwallenpoole

Verwandte Themen