@Diolorca

Как передать путь до файлов скрипту на питоне через контекстное меню windows?

есть небольшой скрипт-конвертер файлов, который вызывается через контекстное меню windows.
Скрипт в контекстное меню добавлен с помощью твика реестра:
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\python]
@="pdf2img" 

[HKEY_CLASSES_ROOT\*\shell\python\command]
@="cmd /k python c:\\Scripts\\pdf2jpg.py \"%1\""

[HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\python]
@="pdf2img" 

[HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\python\command]
@="cmd /k python c:\\Scripts\\pdf2jpg.py \"%1\""

Сам скрипт принимает путь до файла с помощью argv[1].

Проблема в том, что если я выделяю несколько файлов, и запускаю скрипт через контекстное меню, то запускается столько экземпляров скрипта, сколько файлов я выделил. Как сделать так, чтобы запускался один экземпляр скрипта и туда передавались пути до всех выделенных файлов?
  • Вопрос задан
  • 280 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Не, проблема не в питоне, проблема в винде.
На стэковерфлоу предложено решение - перенеси свою программу в пункт "Отправить..." (Send To), там требуемое поведение поддерживается лучше.
Если этого недостаточно, придётся писать плагин для windows explorer.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
shabelski89
@shabelski89
engineer
я тоже думаю что загвоздка в винде, но вопрос как обойти её питоном ?
может через синглетон ?
что будет при таком коде ?
from pdf2image import convert_from_path
import os
from sys import argv


class SingletonMeta(type):
    """
    Класс Одиночка, для запуска единственного экземпляра
    """

    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            instance = super().__call__(*args, **kwargs)
            cls._instances[cls] = instance
        return cls._instances[cls]


class Converter(metaclass=SingletonMeta):
    CONST = 200
    POPPLER_PATH = r'C:\Program Files\poppler-0.68.0\bin'

    def convert_file(self):
        """
        Метод для конвертации файла pdf в картинки постранично
        """

        print("-" * 50)
        print('Конвертирование файла ', argv[1])
        print("-" * 50)

        filepath = argv[1]
        path = os.path.dirname(filepath)
        full_filename = os.path.basename(path)
        filename_without_extension = os.path.splitext(full_filename)[0]

        # конвертация и сохранние файлов
        pages = convert_from_path(path, self.CONST, poppler_path=self.POPPLER_PATH)
        if not os.path.isdir(filename_without_extension):
            print("-" * 50)
            print("Конвертирование завершено!")
            print("-" * 50)
            print(f"Создание папки {filename_without_extension} под файлы картинок")
            try:
                os.mkdir(filename_without_extension)
            except OSError as E:
                print(E)
        print("-" * 50)

        for i, page in enumerate(pages):
            print(f"Сохранение страницы {i + 1} как картинки")
            converted_filename = f"{full_filename}_{i + 1}.jpg"
            page.save(os.path.join(path, full_filename, converted_filename), 'JPEG')
        print("-" * 50)
        print('Сохранение завершено!')
        print("-" * 50)


if __name__ == "__main__":
    s = Converter()
    s.convert_file()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы