Subprocess.run не выполняет команды при вызове python из php

У меня есть эта часть программы 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)

Команда (python3 conv_docx_pdf.py filename1.docx) работает нормально, когда я выполняю ее в терминале Ubuntu. Однако php не может его выполнить.

права на папку docx:

drwxr-xr-x 2 www-data www-data 4096 26 марта 12:58 docx

права на файл $file1

-rw-r--r-- 1 www-data www-data 11738 26 марта 11:45 status29024.docx

У меня есть другие программы Python (которые не используют подпроцесс), которые отлично работают при вызове из php. Любая помощь приветствуется.

В чем ошибка? «php не может его выполнить» может означать, что он не может найти двоичный файл или существуют проблемы с разрешениями для двоичного файла. Пожалуйста, включите сообщение об ошибке. Посмотрите файл php.log и проверьте, на что он жалуется.

ewokx 26.03.2024 05:41

Итак, вы вызываете скрипт Python, который вызывает unoconv? Почему бы вам не вызвать unoconv напрямую?

Olivier 26.03.2024 08:27
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Команда (python3 conv_docx_pdf.py filename1.docx) работает нормально, когда я выполняю ее в терминале Ubuntu.

Команда, сгенерированная предоставленным вами кодом, — это не python3 conv_docx_pdf.py filename1.docx, а python3 conv_docx_pdf.py "filename1.docx" (обратите внимание на дополнительные кавычки).

Вместо этого попробуйте этот код, добавив точку с запятой в конце строки 2:

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

$output = shell_exec($command5);
Ответ принят как подходящий

Я благодарю вас всех за вашу помощь. Наконец я обнаружил, что проблема связана с разрешениями 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/

Другие вопросы по теме