Ubuntu服务器下用PHP执行调用pdflatex的Python脚本遇权限问题
解决PHP调用含pdflatex的Python脚本时的权限/写入问题
核心问题分析
你遇到的报错本质是PHP运行用户(通常是www-data)没有足够权限写入文件,或者工作目录不匹配导致路径错误——哪怕单独给log文件设777,pdflatex还需要读写其他辅助文件(如.aux、.tex源文件、输出PDF),且脚本在命令行和PHP环境下的工作目录可能不一致。
具体解决步骤
1. 确认PHP运行的用户
先在PHP里执行以下代码,明确当前运行PHP的用户:
echo shell_exec('whoami');
一般结果是www-data,后续权限操作都针对这个用户。
2. 统一脚本的工作目录
命令行运行时你可能在/home/ubuntu目录,但PHP调用时默认工作目录是网站根目录(比如/var/www/html),导致Python脚本里的相对路径失效。解决方法二选一:
- 在Python脚本里切换目录:在脚本开头添加:
import os # 切换到脚本所在的目录,确保所有相对路径生效 os.chdir('/home/ubuntu') - 在PHP命令里指定工作目录:修改PHP调用命令,先切换目录再执行脚本:
$command = escapeshellcmd('cd /home/ubuntu && python3 test.py'); $output = shell_exec($command); echo $output;
3. 给目录和文件赋予足够权限
不要只给单个log文件设权限,要确保PHP用户对整个工作目录有读写权限:
- 方法一:修改目录所有权给PHP用户
sudo chown -R www-data:www-data /home/ubuntu - 方法二:开放目录权限并将PHP用户加入组
sudo chmod -R 775 /home/ubuntu sudo usermod -aG ubuntu www-data
4. 让pdflatex以非交互模式运行
报错里出现“Please type another transcript file name”,是因为pdflatex在等待交互式输入,但PHP的shell_exec是无交互环境,会卡住报错。在Python脚本调用pdflatex时添加参数:
# 替换你原来调用pdflatex的代码,加上非交互参数 subprocess.run(['pdflatex', '-interaction=nonstopmode', 'yourfile.tex'], check=True)
-interaction=nonstopmode会让pdflatex遇到错误直接退出,不会等待输入。
5. 用绝对路径调用pdflatex
如果pdflatex不在PHP用户的环境变量路径里,在Python脚本里用绝对路径调用,先通过命令行查路径:
which pdflatex
得到类似/usr/bin/pdflatex,然后在脚本里使用:
subprocess.run(['/usr/bin/pdflatex', '-interaction=nonstopmode', 'yourfile.tex'], check=True)
内容的提问来源于stack exchange,提问作者JavaForAndroid
相关产品推荐
相关产品推荐

