You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 02:23:13