直接通过exec()
这类函数调用python文件的话 如下:
exec('python D:/PycharmProjects/test.py 参数');
接口会卡住半天(即:需要等待python程序运行完毕,接口才会正常响应),
所以需要异步执行python程序
即:接口数据直接返回, 而python程序在后台运行
可以使用popen()
函数创建了一个进程来运行一个 Python 脚本,并且利用 pclose()
函数来关闭这个进程
下面附上PHP接口函数中的示例代码:
public function index(){ $param = request()->post(); if (empty($param)){ $res = [ 'code' => -1, 'message' => 'error', ]; return json($res); } /*** * 业务逻辑代码 ***/ $falg = true; if ($falg){ // 调用python $python_path = 'F:\pythonProject\venv\Scripts\python.exe'; $file_path = 'F:\pythonProject\test.py'; // 异步执行 Python 程序 pclose(popen("start {$python_path} {$file_path} {$param}",'r')); $res = [ 'code' => 0, 'message' => 'success', ]; }else{ $res = [ 'code' => -1, 'message' => 'error', ]; } return json($res); }
python文件部分代码:
import sys from time import sleep from selenium import webdriver from selenium.webdriver.common.by import By def pp(data): option = webdriver.ChromeOptions() # option.add_argument("headless") driver = webdriver.Chrome(options=option) driver.get(data) driver.find_element(By.ID, "kw").send_keys("猫") driver.find_element(By.XPATH, '//*[@id="homeSearchForm"]/span[2]/input').click() print("控制台输出: ", data) # 为测试是否可以异步执行设置延迟5s sleep(5) driver.quit() if __name__ == '__main__': if len(sys.argv) > 1: pp(sys.argv[1])
实测可以实现所需功能!
这里贴出chatgpt对于这行代码的解释
pclose(popen("start {$python_path} {$file_path} {$param}",'r'));
这段 PHP 代码的作用是在 Windows 操作系统上异步执行 test.php 脚本,即不等待 test.php 执行完成,而是立即返回。
解释一下代码:
popen() 函数打开一个进程,并返回一个进程标识符(文件指针)。
在 popen() 函数的第二个参数中,我们使用 “start php.exe test.php” 命令来启动 PHP 解释器并运行 test.php。
“r” 参数告诉 popen() 函数以只读方式打开管道。
pclose() 函数关闭由 popen() 打开的管道。
由于 popen() 函数会返回一个进程标识符,我们可以传递该标识符给 pclose() 函数,以便在后台自动关闭进程。
4 Comments
虽然看不懂,但是感觉很牛
NB啊
试了一下,很管用,跟楼主的使用场景几乎一样哈!特地来留言感谢一下
另外python外部传参,我参考了此文:https://blog.csdn.net/weixin_38037405/article/details/126257310
@skysowe 一起积累进步,加油!