l'exécution du script Python en PHP et l'échange de données entre les deux

est-il possible d'exécuter un script Python dans PHP et de transférer des variables entre elles ?

j'ai une classe qui efface les sites Web pour les données d'une certaine manière globale. je veux le rendre beaucoup plus spécifique et j'ai déjà des scripts pythons spécifiques à plusieurs sites Web.

je cherche un moyen de les intégrer dans ma classe.

un transfert de données sûr et fiable entre les deux est-il même possible ? si oui, comment il est difficile d'obtenir quelque chose comme ça va ?

21
demandé sur Lee Taylor 2012-12-27 04:30:23

4 réponses

vous pouvez généralement communiquer entre les langues en utilisant des formats communs, et en utilisant stdin et stdout à communiquer les données.

exemple avec PHP / Python utilisant un argument shell pour envoyer les données initiales via JSON

PHP:

// This is the data you want to pass to Python
$data = array('as', 'df', 'gh');

// Execute the python script with the JSON data
$result = shell_exec('python /path/to/myScript.py ' . escapeshellarg(json_encode($data)));

// Decode the result
$resultData = json_decode($result, true);

// This will contain: array('status' => 'Yes!')
var_dump($resultData);

Python:

import sys, json

# Load the data that PHP sent us
try:
    data = json.loads(sys.argv[1])
except:
    print "ERROR"
    sys.exit(1)

# Generate some data to send to PHP
result = {'status': 'Yes!'}

# Send it to stdout (to PHP)
print json.dumps(result)
54
répondu Tom van der Woerdt 2012-12-27 00:41:10

vous recherchez "interprocess communication" (IPC) - vous pouvez utiliser quelque chose comme XML-RPC, qui vous permet essentiellement d'appeler une fonction dans un processus distant, et gère la traduction de tous les types de données d'argument entre les langues (de sorte que vous pouvez appeler une fonction PHP à partir de Python, ou vice versa-aussi longtemps que les arguments sont de un type supporté)

Python a un builtin XML-RPC server et client

le phpxmlrpc la bibliothèque a à la fois un client et un serveur

Il y a des exemples pour les deux, Python serveur et client et PHP client et serveur

10
répondu dbr 2012-12-27 01:22:27

le meilleur pari est d'exécuter python comme un sous-processus et de capturer sa sortie, puis de l'analyser.

$pythonoutput = `/usr/bin/env python pythoncode.py`;

L'utilisation de JSON faciliterait probablement la production et l'analyse dans les deux langues, puisque c'est la norme et que les deux langues le supportent (du moins les versions non anciennes le font). En Python,

json.dumps(stuff)

et puis en PHP

$stuff = json_decode($pythonoutput);

vous pouvez aussi enregistrer explicitement les données sous forme de fichiers, ou utiliser des sockets, ou avoir de nombreuses façons différentes de faire ceci plus efficace (et plus complexe) selon le scénario exact dont vous avez besoin, mais c'est le plus simple.

1
répondu Amadan 2012-12-27 00:41:28

Juste eu le même problème et je voulais partager ma solution. (suit de près ce Qu'Amadan suggère)

python pièce

import subprocess

output = subprocess.check_output(["php", path-to-my-php-script, input1])

vous pouvez aussi faire: blah = input1 au lieu de simplement soumettre un arg sans nom... et puis utilisez le $ _GET ['blah'].

php pièce

$blah = $argv[1];



if( isset($blah)){

    // do stuff with $blah

}else{
    throw new \Exception('No blah.');
}
1
répondu fchaubard 2013-08-28 17:08:35