我想从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”:[{“face_rectangle”:{ “width”:134,“top”:159,“left”:242,“height”:134},“face_token”:“a0bc6e53782d0c38a837187a832da542”}]}'
但它打印出空方括号。[]
如果你只是想做一个CURL请求,你最好只使用PHP的内置CURL函数来保持你的代码不那么复杂(https://www.php.net/manual/en/book.curl.php)
但是如果你仍然想使用python脚本,那么要检查的事情是
#!/usr/bin/env python
(see explanation)的第一行有python SHEBANG除此之外,您可以尝试使用exec
而不是shell_exec
,因为如果抛出错误,shell_exec
将不会返回值
$command = 'python /scripts/some_script.py';
$response = [];
$code = 0;
exec($command, $response, $code);
var_dump($code);
print_r($response);
创建一个shell文件来执行你的python脚本并确保它是可执行的,然后让PHP执行这个shell文件。
这个对我有用