如何从php执行python脚本并从python发送curl请求?

时间:2019-03-31 15:41:20

标签: php python xampp ubuntu-18.04

我想从php脚本执行一个python脚本,它将向Web api发送一个curl请求,并将curl请求的输出返回到php脚本,该脚本将打印它或进行进一步处理。问题是当我运行时python脚本独立产生正确的输出,但是当从php脚本调用时却不起作用

我尝试更改xampp服务器上htdocs文件夹的权限,并且由于我认为通过api请求上传到服务器的图像文件不可访问。

这是执行python脚本的php脚本的一部分

 if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
    echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
    sleep(5);
    $command = escapeshellcmd('python3 /opt/lampp/htdocs/script.py');
    $output = shell_exec($command);
    echo $output;
}

这是python脚本

#!/usr/bin/env python
import sys
import subprocess
import os
import ast
import requests
from time import sleep
import datetime
file = open('/opt/lampp/htdocs/count.txt','r')
uid=file.read().strip()
file.close()
print(uid)
pipe = subprocess.Popen('curl -X POST "https://api- 
us.faceplusplus.com/facepp/v3/detect" -F 
"api_key=some_key" \
-F "api_secret=some_key" \
-F "image_file=@/opt/lamppp/htdocs/image.jpg"', stdout=subprocess.PIPE, shell=True, 
universal_newlines=True)
j = pipe.stdout.readlines()
print(j)

当调用php页面时,预期的输出应显示如下内容。

['{“ image_id”:“ mprd5Pjd9ni + sPD4fWzv9g ==”,“ request_id”:“ 1554044606,8bba1d32-9b73-4457-a024-cb3ad66ee349”,“ time_used”:623,“ faces”:[{ “:{” width“:134,” top“:159,” left“:242,” height“:134},” face_token“:” a0bc6e53782d0c38a837187a832da542“}]}'

但它会打印出空的方括号。[]

2 个答案:

答案 0 :(得分:1)

如果您只想发出CURL请求,那么最好只使用PHP的内置CURL函数来使代码复杂度降低(https://www.php.net/manual/en/book.curl.php

但是,如果您仍然想使用python脚本,那么要检查的事情就是

  • 该脚本可由XAMPP用户执行
  • 您在python脚本#!/usr/bin/env pythonsee explanation)的第一行上有python SHEBANG
  • Python是XAMPP用户PATH的一部分(或在shell_exec中使用完整路径而不是python)

除此之外,您可以尝试使用exec代替shell_exec,因为如果抛出错误,shell_exec不会返回值

$command = 'python /scripts/some_script.py';
$response = [];
$code = 0;
exec($command, $response, $code);
var_dump($code);
print_r($response);

答案 1 :(得分:0)

制作一个shell文件来执行您的python脚本并确保它是可执行的,然后使PHP执行该shell文件。

对我有用