Не работает скрипт конвертации
Имеем Ubuntu 18, python3.9 и скрипт:
from subprocess import Popen, PIPE, STDOUT
from io import StringIO
def runCmd(command, print_output=True):
popen = Popen(command, stdout=PIPE, stderr=STDOUT, universal_newlines=True)
out = StringIO()
for line in popen.stdout:
if print_output:
print(line, end='')
else:
out.write(line)
popen.stdout.close()
return_code = popen.wait()
if not return_code == 0:
raise RuntimeError(
'The process call "{}" returned with code {}. The return code is not 0, thus an error '
'occurred.'.format(list(command), return_code))
stdout_string = out.getvalue()
out.close()
return stdout_string
path_to_folder = '$(pwd)'
path_ppt_file = '$(pwd)/test.pptx'
name_file = 'test'
cmd = f'$(which soffice) --headless "-env:UserInstallation=file:///tmp/LibreOffice_Conversion_{name_file}" ' \
f'--convert-to pdf:writer_pdf_Export --outdir {path_to_folder} {path_ppt_file}'
runCmd(cmd)
В каталоге, где лежит скрипт лежат файлы:
- test.pptx (владелец - пользователь)
- script.py (владелец - пользователь)
Когда запускаю скрипт, выходит ошибка:
FileNotFoundError: [Errno 2] No such file or directory: '$(which soffice) --headless "-env:UserInstallation=file:///tmp/LibreOffice_Conversion_test" --convert-to pdf:writer_pdf_Export --outdir $(pwd) $(pwd)/test.pptx'
Но, если взять и скопировать из ошибки команду и запустить в этом же каталоге:
$(which soffice) --headless "-env:UserInstallation=file:///tmp/LibreOffice_Conversion_test" --convert-to pdf:writer_pdf_Export --outdir $(pwd) $(pwd)/test.pptx
То все прекрасно сконвертируется и появится PDF-файл...
Почему через скрипт Python не хочет конвертироваться?
UPD: Решил пойти по другому пути:
cmd = f'/usr/bin/soffice --headless '\
f'-env:UserInstallation=file:///tmp/LibreOffice_Conversion_{self.name_file} '\
f'--convert-to pdf:writer_pdf_Export --outdir {self.ubuntu_pref}/{self.path_to_folder} {self.ubuntu_pref}/{path_ppt_file}'
comand_split = shlex.split(cmd)
child = subprocess.Popen(comand_split, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, encoding='utf-8',
shell=False)
child.wait(timeout=15)
print('child.returncode:', child.returncode)
print('child.communicate():', child.communicate())
На это раз хоть в консоли стали ошибки видны:
child.returncode: 127
child.communicate(): ('/usr/bin/soffice: 46: /usr/bin/soffice: dirname: not found\n/usr/bin/soffice: 48: /usr/bin/soffice: basename: not found\n/usr/bin/soffice: 49: /usr/bin/soffice: sed: not found\n/usr/bin/soffice: 49: /usr/bin/soffice: ls: not found\n/usr/bin/soffice: 51: /usr/bin/soffice: dirname: not found\n/usr/bin/soffice: 145: /usr/bin/soffice: grep: not found\n/usr/bin/soffice: 151: /usr/bin/soffice: uname: not found\n/usr/bin/soffice: 191: exec: /home/FOLDER_USER/FOLDER_APP/oosplash: not found\n', None)
Если зайти в /usr/bin/, то soffice там лежит:

А если в консоли ssh запустить:
/usr/lib/libreoffice/program/soffice
То выходит ошибка:
Failed to open display
javaldx failed!
Warning: failed to read path from javaldx
Может это всему виной?