Ответы пользователя по тегу Python
  • Почему не отрабатывает субпроцесс?

    belkin_aa
    @belkin_aa Автор вопроса
    Обо мне: https://clck.ru/ge9cs
    Спасибо всем кто отозвался, проблема решена. Оставлю обработчик конвертера, может кому пригодится. Да, может, он не идеален, но зато работает. Если кто предложит лучше, то я только за.

    import os
    
    def made_folder(verify_path):
        if os.path.exists(verify_path):
            pass
        else:
            os.mkdir(verify_path)
        return verify_path
    
    class Convert_file():
        def __init__(self, name_file, ubuntu_pref, path_to_folder, exception='pdf'):
            # === У всех путей не указывать в конце слеш! ===
            # name_file = имя файла без расширения
            # exception - расширение файла
            # ubuntu_pref - путь Ubuntu до проекта
            # path_to_folder - расположение относительно проекта
    
            self.name_file = name_file
            self.exception = exception
            self.ubuntu_pref = ubuntu_pref
            self.path_to_folder = path_to_folder
    
            self.process_convert = []
    
            self.is_convert_pptx_in_pdf = False
            self.is_convert_pdf_in_png = False
    
            self.url_first_slide = f'{self.path_to_folder}/covers/slide-01.png'
    
            self.cover_presentation = 'static/wait.gif'
    
        def convert_pptx_to_pdf(self, exception_file='pptx'):
            # === КОНВЕРТАЦИЯ pptx  В pdf ===
            path_ppt_file = f'{self.path_to_folder}/{self.name_file}.{exception_file}'
    
            # -- Проверка есть ли PPTX-файл ---
            if self.is_file(path_ppt_file):
                # -- Проверка есть ли PDF-файл ---
                path_pdf = f'{self.path_to_folder}/{self.name_file}.pdf'
                if self.is_file(path_pdf):
                    self.add_proc_conv(proc='conv ppt',
                                       rezult=False,
                                       cmd='pdf-file created')
                else:
                    cmd = f'/usr/bin/soffice soffice --headless "-env:UserInstallation=file:///tmp/LibreOffice_Conversion_{self.name_file}" --convert-to pdf:writer_pdf_Export --outdir {self.path_to_folder} {self.ubuntu_pref}/{path_ppt_file}'
                    child = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE,
                                            stderr=subprocess.STDOUT, encoding='utf-8', shell=False)
                    start_time = datetime.datetime.now()
                    while True:
                        curent_time = datetime.datetime.now()
                        if child.returncode == 0:
                            break
                        delta = curent_time - start_time
                        if delta.total_seconds() > 15:
                            break
                        if child.poll() == 0:
                            break
                    if child.returncode == 0:
                        self.add_proc_conv(proc='conv ppt',
                                           rezult=True,
                                           cmd=cmd,
                                           dop=(child, child.returncode))
                        self.is_convert_pptx_in_pdf = True
                    else:
                        self.add_proc_conv(proc='conv ppt',
                                           rezult=False,
                                           cmd=cmd)
            else:
                self.add_proc_conv(proc='conv ppt',
                               rezult=False,
                               cmd='no ppt-file',
                               dop=path_ppt_file)
    
        def convert_pdf_to_png(self):
            work_dir = f'{self.ubuntu_pref}/{self.path_to_folder}'
    
            path_pdf_file = f'{self.path_to_folder}/{self.name_file}.pdf'
            # --- ПРОВЕРКА есть ли PDF-файл ---
            if self.is_file(path_pdf_file):
                if self.is_file(self.url_first_slide):
                    self.add_proc_conv(proc='conv pdf',
                                       rezult=False,
                                       cmd='first png-file created',
                                       dop=self.url_first_slide)
                    self.cover_presentation = self.url_first_slide
                else:
                    convert_dir_png = made_folder(verify_path=f'{work_dir}/covers')
                    cmd = f'gs -sDEVICE=pngalpha -o {convert_dir_png}/slide-%02d.png -r96 {work_dir}/{self.name_file}.pdf'
                    child = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE,
                                      stderr=subprocess.STDOUT, encoding='utf-8',
                                         shell=False)
                    start_time = datetime.datetime.now()
                    while True:
                        curent_time = datetime.datetime.now()
                        if child.returncode == 0:
                            break
                        delta = curent_time - start_time
                        if delta.total_seconds() > 15:
                            break
                        if child.poll() == 0:
                            break
                    if (child.returncode == 0) and (self.is_file(self.url_first_slide)):
                        self.add_proc_conv(proc='conv pdf',
                                           rezult=True,
                                           cmd=cmd,
                                           dop=child)
                        self.is_convert_pdf_in_png = True
                        self.cover_presentation = self.url_first_slide
                    else:
                        self.add_proc_conv(proc='conv pdf',
                                           rezult=False,
                                           cmd=cmd)
            else:
                self.add_proc_conv(proc='conv pdf',
                                   rezult=False,
                                   cmd='no pdf-file')
    
        def add_proc_conv(self, proc, rezult, cmd, dop=None):
            self.process_convert.append(
                {proc: rezult,
                 'cmd': cmd,
                 'dop': dop
                 }
            )
    
        def is_file(self, path_to_file_full):
            # == Проверяет есть ли файл ==
            return os.path.exists(path_to_file_full)
    Ответ написан
    Комментировать