当从PHP调用Python时,subprocess.run不执行命令

1 投票
2 回答
46 浏览
提问于 2025-04-12 18:43

我有一段PHP程序:

$docx_filename = "/var/www/editeur/docx/".$file1
$command5 = "python3 conv_docx_pdf.py \"$docx_filename\"";
$output = shell_exec($command5);

这个脚本叫做conv_docx_pdf.py:

import subprocess
import os
import sys

def docx_to_pdf(input_file):
    # Get the file name without extension
    file_name, _ = os.path.splitext(input_file)
    
    # Construct the output file path with .pdf extension
    output_file = file_name + ".pdf"
    
    # Run unoconv to convert DOCX to PDF
    subprocess.run(["unoconv", "-f", "pdf", input_file])

    
    return output_file

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: python script.py <input_file>")
        sys.exit(1)
    
    input_file = sys.argv[1]  # Get the input file from command-line argument
    output_file = docx_to_pdf(input_file)
    print("Output PDF:", output_file)

当我在Ubuntu终端执行命令(python3 conv_docx_pdf.py filename1.docx)时,一切正常。但是,PHP却无法执行这个命令。

关于docx文件夹的权限:

drwxr-xr-x 2 www-data www-data 4096 Mar 26 12:58 docx

关于文件$file1的权限:

-rw-r--r-- 1 www-data www-data 11738 Mar 26 11:45 status29024.docx

我还有其他的Python程序(不使用subprocess),在PHP中调用时都能正常工作。希望能得到一些帮助。

2 个回答

0

在Ubuntu终端中执行命令(python3 conv_docx_pdf.py filename1.docx)时,一切正常。

你提供的代码生成的命令不是 python3 conv_docx_pdf.py filename1.docx,而是 python3 conv_docx_pdf.py "filename1.docx"(请注意多了双引号)。

在第二行末尾加上分号后,试试这个代码:

$file1 = "filename1.docx";
$docx_filename = "/var/www/editeur/docx/" . $file1;
$command5 = "python3 conv_docx_pdf.py $docx_filename";

$output = shell_exec($command5);
1

感谢大家的帮助。我终于找到了问题的根源,原来是和Unoconv以及www-data的权限有关。我参考了这个网站上的建议。

cd /var/www/
sudo mkdir .cache
sudo chown -R www-data:www-data .cache/
sudo chmod -R 744 .cache/
sudo mkdir .config
sudo chown -R www-data:www-data .config/ 
sudo chmod -R 744 .config/

撰写回答