Как подпроцесс обрабатывает указатель файла? - PullRequest
2 голосов
/ 15 января 2020

Предположим, что скелет кода в Python выглядит следующим образом. Этот код вызывает другой исполняемый скрипт bash для параллельной работы в Ubuntu 18.04.

#!/usr/bin/env python3
#encoding:utf-8

import subprocess 
with open(file='subprocess_output.log', mode='a') as file_pointer:
    subprocess.Popen(args=['./subprocess.bash'], stdout=file_pointer, stderr=file_pointer)

#Next section

Работает. Но мне любопытно, закрывает ли указатель with указатель файла и освобождает ресурс, как только основной код переходит к следующему разделу. Разве это не то, что должен делать оператор with? Чтобы получить и освободить ресурсы безопасно ? Но если дескриптор файла журнала освобождается сразу после вызова, как буфер буфера подпроцесса записывает в журнал позже, когда основной сценарий перешел?

Вероятно, ответ очевиден для любого, кто глубже понимает, как файлы обрабатываются ОС на более низком уровне. Так что любой указатель на онлайн ресурс (каламбур) будет отличным.

1 Ответ

1 голос
/ 15 января 2020

Каждый процесс имеет свой собственный набор открытых файлов. Подпроцессы создаются с копиями из (подмножество) дескрипторов открытого файла их родителей («дескрипторы» в Unix, с подмножеством, управляемым флагом FD_CLOEXEC ). with немедленно закрывает дескрипторы родителя, но это никак не влияет на потомка.

Иногда имеет значение, остаются ли любые копии: например, чтение из канала производит EOF, когда каждая копия конца письма была закрыта.

...