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 ?
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)
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
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.
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.');
}