使用 shell_exec 启动 Python 脚本时,脚本不起作用



我编写了一个Python脚本,使用rembg库删除图像的背景,然后使用PIL合成图像。

对于这个项目,创建了一个virtualenv,并在那里安装了rembg。所有这些都是在Ubuntu 20.04服务器上完成的。

项目文件夹位于/var/www/work/py/banner_generator,包含一个名为venv的虚拟环境文件夹。Python脚本本身位于/var/www/work/py/banner_generator/banner_generator.py。如果我从控制台中运行命令/var/www/work/py/banner_generator/venv/bin/python3.8 /var/www/work/py/banner_generator/banner_generator.py,它将按预期工作。

但是,我需要在PHP脚本中运行此脚本。当我在PHP中执行代码时:

$cmd = "/var/www/work/py/banner_generator/venv/bin/python3.8 /var/www/work/py/banner_generator/banner_generator.py";
$output = shell_exec($cmd);
echo $output;

什么也不会发生。当我注释掉代码,只留下"print("work")"在Python脚本中,一切都是从PHP开始的。

我决定注释掉我的代码并测试它。首先,在Python脚本中,我只留下了"print("work")"然后检查了一下。在本例中,一切都从PHP开始工作。然后我决定继续试验并取消所有导入的注释,产生了以下代码:

import argparse
import os
from rembg import remove
from PIL import Image, ImageDraw, ImageFilter, ImageEnhance
import requests
from io import BytesIO
print("work")

我再次运行它,它没有工作。"已经做完语句没有显示

然后我开始注释掉一些导入,经过反复试验,发现这个问题只在导入rembg时发生。换句话说,下面的代码可以工作:

import argparse
import os
# from rembg import remove
from PIL import Image, ImageDraw, ImageFilter, ImageEnhance
import requests
from io import BytesIO
print("work")

有趣的事实:PIL只安装在虚拟环境中,但是它的导入不会引起任何问题。但是,由于某些原因,导入rembg会导致问题。

您可以尝试设置PYTHONPATH环境变量,以便在运行Python脚本之前在PHP脚本中包含rembg库的路径。例如:

putenv("PYTHONPATH=/var/www/work/py/banner_generator/venv/lib/python3.8/site-packages");
$cmd = "/var/www/work/py/banner_generator/venv/bin/python3.8/var/www/work/py/banner_generator/banner_generator.py";
$output = shell_exec($cmd);
echo $output;

最新更新