Можно ли запустить несколько команд ОС, используя переменную в Python? - PullRequest
0 голосов
/ 08 апреля 2020

Здравствуйте. Я пытаюсь запустить несколько команд ОС, используя Python в Ма c ОС

Я хочу преобразовать изображение в tif-файл, используя команду конвертации в терминале. Однако мне нужно конвертировать 100 изображений, я делаю программу Python, чтобы упростить ее.

import os
import subprocess

files = os.listdir("/Users/woonie/Downloads/test")

i=1
for file in files:
    args=['convert',file,'-resize','100%','-type',"Grayscale","/Users/woonie/Downloads/test/kor.",i,"test.exp0.tif"]
    subprocess.Popen(args)
    i = i+1

конвертировать имя файла -...- output_filename.exp0.tif - это форма команды преобразования, поэтому мне нужно каждый раз меняйте имя файла и имя выходного файла. У меня есть список имен файлов в файлах. И я хочу поставить номер изображения после «теста», чтобы он стал kor.test1.exp0.tif, kor.test2.exp0.tif, et c.

Traceback (most recent call last):
  File "/Users/woonie/PycharmProjects/image_chage/change.py", line 9, in <module>
    subprocess.Popen(args)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py", line 854, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py", line 1637, in _execute_child
    self.pid = _posixsubprocess.fork_exec(
TypeError: expected str, bytes or os.PathLike object, not int

Но эта ошибка вышла .

Итак, я изменил этот код на

args=['convert'+str(file)+'-resize','100%','-type',"Grayscale","/Users/woonie/Downloads/test/kor."+str(i)+"test.exp0.tif"]

Но появилась та же ошибка ... Это работало, когда я вводил эту команду прямо в Терминал.

Я неправильно использовал подпроцесс? или я не могу запрограммировать то, что хочу

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

Используйте

subprocess.run(args)

вместо

subprocess.Popen(args)

При этом ваш массив args, вероятно, должен выглядеть как

args=['convert', str(file), '-resize','100%','-type',"Grayscale","/Users/woonie/Downloads/test/kor."+str(i)+"test.exp0.tif"]

, поскольку имя файла и параметры изменения размера, вероятно, являются отдельными аргументами.

0 голосов
/ 13 апреля 2020

С вашим кодом довольно много проблем.


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

Итак, рассмотрите возможность запуска вашего кода с чем-то вроде:

import os

# Go to where the images are
os.chdir('/Users/woonie/Downloads/test')

Вместо использования os.listdir() вы получите гораздо большую гибкость, если будете использовать глобирование точно так же, как в оболочке. Итак, если вы хотите обрабатывать только JPEG, а не TIFF, которые вы создали в предыдущем запуске, используйте:

import glob

# Get list of JPEGs to process
JPEGs = glob.glob('*jpg')

Я не уверен, почему вы используете subprocess.Popen() - вы обычно делаете это, когда Вы хотите захватить вывод, вы также можете использовать subprocess.run()


Я не знаю, почему вы используете -resize 100%. Откуда это пришло? В любом случае изображение должно быть на 100%.


Если вы хотите сформулировать свое выходное имя файла, вы можете более просто использовать f-strings . Итак, избавившись от всех длинных путей, ваш последний параметр становится:

f'kor.{i}test.exp0.tif'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...