Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 29, 2018 22:17:36

Kustodiev_17
Зарегистрирован: 2013-12-25
Сообщения: 26
Репутация: +  1  -
Профиль   Отправить e-mail  

Запуск внешней команды из программы Python

Здравствуйте.

Вручную из командной строки запускаю конвертацию файла и всё работает:

 convert -density 300 -units pixelsperinch g:\1\0008.jpg -compress Group4 g:\1\0008.tif

Для автоматизации при пакетной обработке нашёл предполагаемый вариант:

 import subprocess
subprocess.run(["G://Program Files//ImageMagick-7.0.7-Q16//convert.exe",
                "-density 300",
                "-units pixelsperinch",
                "g://1//0009.jpg",
                "-compress Group4",
                "g://1//0009.tif"])

Не работает… (Win 8.1, Питон 3.5)

Уточнение : На конвертацию уходит время, порядка 2 - 5 секунд (в зависимости от мощности ПК)
Вопрос, органически встающий, даже при решении вопроса темы - если делать две конвертации - нужно как-то дожидаться выполнения первой, запускать её (вторую конвертацию) всё-равно или есть варианты?

Отредактировано Kustodiev_17 (Апрель 29, 2018 23:32:54)

Офлайн

#2 Апрель 29, 2018 23:34:17

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Запуск внешней команды из программы Python

 "G://Program Files
Странная штука
надо
 "G:\\Program Files
или
 "G:/Program Files
“-density 300”, Как то непоследовательно Уж бъете так бейте до конца аргументы.

Я бы написал shell=True и передал все одной строкой.



Офлайн

#3 Апрель 29, 2018 23:47:51

Kustodiev_17
Зарегистрирован: 2013-12-25
Сообщения: 26
Репутация: +  1  -
Профиль   Отправить e-mail  

Запуск внешней команды из программы Python

Вариант:

 adress = "g://Program Files//ImageMagick-7.0.7-Q16//convert.exe"
arguments = " -density 300 -units pixelsperinch g://1//0009.jpg -compress Group4 g://1//0009.tif"
subprocess.run(adress + arguments, shell=True)
Тоже не работает. Со слэшами попробовал “поиграться” - не дало результата. Возможно есть способ узнать что “не нравиться” программе?

Отредактировано Kustodiev_17 (Апрель 29, 2018 23:48:03)

Офлайн

#4 Апрель 30, 2018 00:10:03

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Запуск внешней команды из программы Python

Kustodiev_17
Возможно есть способ узнать что “не нравиться” программе?
Слеши у тебя неправильные. Символ / и символ \ - это разные символы. Они воспринимаются по-разном как виндой, так и питоном.

  
s = r"g:\Program Files\ImageMagick-7.0.7-Q16\convert.exe -density 300 -units pixelsperinch g:\1\0009.jpg -compress Group4 g:\1\0009.tif"



Офлайн

#5 Апрель 30, 2018 00:26:12

Kustodiev_17
Зарегистрирован: 2013-12-25
Сообщения: 26
Репутация: +  1  -
Профиль   Отправить e-mail  

Запуск внешней команды из программы Python

py.user.next
Возможно, не правильные. Я ориентируюсь на то, что работает. Например:

 import os
directory = 'g://2/'
# В данную директорию были скопированы файлы от сканирования документов
# с шаблонным именем "сканирование<nnnn>.jpg"
for name in os.listdir(directory):
    # print(name)
    name_new = name[12:]
    os.chdir(directory)
    print(name_new)
    os.rename(name, name_new)

сработало, да, и ранее работало - “и поэтому всё так произошло” (с)

Тем не менее вариант:

 s = r"g:\Program Files\ImageMagick-7.0.7-Q16\convert.exe -density 300 -units pixelsperinch g:\1\0009.jpg -compress Group4 g:\1\0009.tif"
subprocess.run(s, shell=True)

не работает

…. А-а-а вариант

 s = r"g:\Program Files\ImageMagick-7.0.7-Q16\convert.exe -density 300 -units pixelsperinch g:\1\0009.jpg -compress Group4 g:\1\0009.tif"
subprocess.run(s)

Сработал. Премного благодарен. Теперь остаются вопросы по пакетной обработке - можно ли сразу запускать скрипты циклом, допустим для 10-ти файлов или правильнее оформить окончание одной конвертации, а затем запускать другую конвертацию?

Офлайн

#6 Апрель 30, 2018 01:10:53

Kustodiev_17
Зарегистрирован: 2013-12-25
Сообщения: 26
Репутация: +  1  -
Профиль   Отправить e-mail  

Запуск внешней команды из программы Python

Для следящих за темой.

Следующий код:

 external_program = "g://Program Files//ImageMagick-7.0.7-Q16//convert.exe "
input_path = 'g://1//'
output_path = "g://1//"
input_file = '0011.jpg'
output_file = "0011.tif"
constant_01 = '-density 300 -units pixelsperinch '
constant_02 = " -compress Group4 "
for n in range(12, 20):
    input_file = '00' + str(n) + input_file[4 : ]
    output_file = '00' + str(n) + output_file[4 : ]
    s = external_program + constant_01 + input_path + input_file + constant_02 + output_path + output_file
    subprocess.run(s)

удачно и результативно отработал. Причём при вызове команды на отработку внешней программы открывается окно командной строки, после конвертации и успешной работы окно закрывается и при вызове следующей команды открывается новое окно и так далее. Следовательно вопрос про пакетную обработку отпал. Всем участвующим и сочувствующим премногие благодарности.

Офлайн

#7 Апрель 30, 2018 02:31:57

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Запуск внешней команды из программы Python

Не надо писать двойной слеш. Двойной слеш используется только при обращении к машине. В остальных случаях двойной слеш равен одинарному слешу, который равен одинарному бэкслешу. Выучи символы, их графический вид и названия.

Вот способы задания путей в винде

g:/Program Files/ImageMagick-7.0.7-Q16/convert.exe
g:\Program Files\ImageMagick-7.0.7-Q16\convert.exe

Вот те же пути, только заданные в строках питона
s = 'g:/Program Files/ImageMagick-7.0.7-Q16/convert.exe'

s = 'g:\\Program Files\\ImageMagick-7.0.7-Q16\\convert.exe'
s = r'g:\Program Files\ImageMagick-7.0.7-Q16\convert.exe'
Слеш не требует экранирования в строке питона, тогда как бэкслеш требует экранирования, потому что сам бэкслеш для строки является специальным символом, который определяет ряд правил для восприятия строкой следующего после бэкслеша символа или символов.

Из-за того, что ты не знаешь названий символов, ты даже не можешь понять, что тебе тут говорят. Взялся за программирование, не зная азов обычного использования компьютера на уровне оператора ПК.



Отредактировано py.user.next (Апрель 30, 2018 02:36:14)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version