Запустите подпроцесс, который не блокирует файлы, на которые родительский перенаправляет - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь создать подпроцесс, который должен работать после закрытия основного процесса.Эта часть работает нормально, но если я перенаправлю вывод этого процесса в файл, я не смогу запустить сценарий второй раз, потому что процесс все еще блокирует файл журнала.

Этот короткий пример демонстрирует проблему:В этом случае второй процесс - «блокнот» и запускается «other.cmd».В то время как основным процессом / сценарием является «test_it.py», который запускается «start_it.cmd».

start_it.cmd

@python test_it.py > test.log

test_it.py

import subprocess
from subprocess import DEVNULL, STDOUT
subprocess.Popen(["other.cmd"], stdin=DEVNULL, stdout=DEVNULL, stderr=STDOUT)

other.cmd

start notepad

Когда start_it.cmd выполняется во второй раз, произойдет сбой с этим сообщением об ошибке "Процесс не может получить доступ к файлу, поскольку он используется другим процессом ".

Как запустить подпроцесс, чтобы он не блокировал файл журнала?

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Решение с использованием трубы. multiplexer.py

with open('log.txt', 'a') as outputFile:
    while True:
        data = sys.stdin.read(1024)
        if None == data:
            break
        outputFile.write(data)

start_it.cmd

@python test_it.py | python multiplexer.py

Все остальное остается прежним.

0 голосов
/ 16 апреля 2019

Я нашел решение, которое близко к тому, что я изначально планировал:

subprocess.Popen("explorer other.cmd", shell=True)

Позволяя обозревателю запустить файл .cmd, это успешно отсоединяет вызванный .cmd от исходного процесса. И поэтому не сохраняет файл журнала открытым.

...