我写了一个 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;
什么都没发生。当我注释掉代码并在 Python 脚本中只留下“print("work")”时,一切都在 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 会导致问题。
在运行 Python 脚本之前,您可以尝试设置 PYTHONPATH 环境变量以在 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;