Очистка временной папки после длительных выходов подпроцесса - PullRequest
1 голос
/ 12 мая 2010

У меня есть скрипт Python (работающий внутри другого приложения), который генерирует кучу временных изображений. Затем я использую subprocess для запуска приложения, чтобы просмотреть их.

Когда процесс просмотра изображения существует, я хочу удалить временные изображения.

Я не могу сделать это из Python, поскольку процесс Python мог завершиться до завершения подпроцесса. Т.е. я не могу сделать следующее:

p = subprocess.Popen(["imgviewer", "/example/image1.jpg", "/example/image1.jpg"])
p.communicate()
os.unlink("/example/image1.jpg")
os.unlink("/example/image2.jpg")

.. так как это блокирует основной поток, я не могу проверить, нет ли выхода pid в потоке и т. Д.

Единственное решение, которое я могу придумать, означает, что я должен использовать shell=True, которого я бы предпочел избежать:

import pipes
import subprocess

cmd = ['imgviewer']
cmd.append("/example/image2.jpg")

for x in cleanup:
    cmd.extend(["&&", "rm", pipes.quote(x)])

cmdstr = " ".join(cmd)
subprocess.Popen(cmdstr, shell = True)

Это работает, но вряд ли изящно ..

По сути, у меня есть фоновый подпроцесс, и я хочу удалить временные файлы при его выходе, даже если процесс Python больше не существует.

1 Ответ

1 голос
/ 12 мая 2010

Если вы работаете с любым вариантом Unix, вы можете разветвить свою программу на Python, и родительский процесс продолжит свою жизнь, пока дочерний процесс демонизируется, запускает средство просмотра (в любом случае это не имеет значения) дочерний процесс, у которого нет другой работы в жизни ;-), и очищается после него. оригинальный процесс Python может существовать или не существовать на этом этапе, но, конечно, дочерний процесс "ожидающий очистки" ( какой-то процесс или другой должен выполнить очистку). В конце концов, верно? -).

Если вы работаете в Windows или вам нужен кроссплатформенный код, тогда пусть ваша программа на Python "порождает" (то есть, просто начинается с подпроцесса, а затем продолжает жизнь) другую (гораздо меньшую) программу, которая поручено запустить зрителя (блокировка, кого это волнует) и затем выполнить очистку. (Если в Unix, даже в этом случае вы можете захотеть демонизировать, в противном случае дочерний процесс может исчезнуть, когда это сделает родительский процесс).

...