Найти - Пользователи
Полная версия: Запуск внешней команды из программы Python
Начало » Python для новичков » Запуск внешней команды из программы Python
1
Kustodiev_17
Здравствуйте.

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

 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 секунд (в зависимости от мощности ПК)
Вопрос, органически встающий, даже при решении вопроса темы - если делать две конвертации - нужно как-то дожидаться выполнения первой, запускать её (вторую конвертацию) всё-равно или есть варианты?
doza_and
 "G://Program Files
Странная штука
надо
 "G:\\Program Files
или
 "G:/Program Files
“-density 300”, Как то непоследовательно Уж бъете так бейте до конца аргументы.

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

Kustodiev_17
Вариант:

 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)
Тоже не работает. Со слэшами попробовал “поиграться” - не дало результата. Возможно есть способ узнать что “не нравиться” программе?
py.user.next
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"
Kustodiev_17
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-ти файлов или правильнее оформить окончание одной конвертации, а затем запускать другую конвертацию?
Kustodiev_17
Для следящих за темой.

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

 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)

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

Вот способы задания путей в винде
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'
Слеш не требует экранирования в строке питона, тогда как бэкслеш требует экранирования, потому что сам бэкслеш для строки является специальным символом, который определяет ряд правил для восприятия строкой следующего после бэкслеша символа или символов.

Из-за того, что ты не знаешь названий символов, ты даже не можешь понять, что тебе тут говорят. Взялся за программирование, не зная азов обычного использования компьютера на уровне оператора ПК.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB