2016-08-02 22 views
2

Ich habe Skript test1.py (Beispiel)Python öffnet zweimal eine Datei, wenn subprocess.Popen für Lauf verwendet ein anderes Skript

import test2 


def main(): 
    f = open("File.txt") 
    test2.run() 

    while True: 
     pass 

if __name__ == '__main__': 
    main() 

Und test2.py

import subprocess, sys, os 

def run(): 
    # Self run 
    subprocess.Popen(['C:\\Windows\\System32\\cmd.exe', '/C', 'start', 
          sys.executable, os.path.abspath(__file__)]) 

def main(): 
    while True: 
     pass 

if __name__ == '__main__': 
    main() 

Das Problem, dass die ist Starten des zweiten Skripts öffnet die Datei "File.txt" erneut. Warum öffnet das zweite Skript beim Start die Datei?

D:\test>Handle.exe File.txt 

Handle v4.0 
Copyright (C) 1997-2014 Mark Russinovich 
Sysinternals - www.sysinternals.com 

python.exe   pid: 9376 type: File   29C: D:\test\File.txt 
python.exe   pid: 9792 type: File   29C: D:\test\File.txt 

Antwort

1

Das Kind Prozess erbt eine Datei-Handle für die Kompatibilität mit dem Modell Unix (siehe PEP 446 für weitere Erklärung). Nach dem Unterprozessaufruf sollten sowohl das ursprüngliche als auch das neue Skript Zugriff auf die Datei haben. Unter Windows bedeutet das, dass zwei separate Dateihandles geöffnet sind.

Eine bessere Idiom, wenn Sie dies vermeiden wollen, ist schließen Sie die Datei, bevor gabeln, entweder explizit oder über das with Konstrukt: geöffnet

with open('File.txt', 'r') as inputfile: 
    pass # or do something with inputfile 
+0

Ich gab ein einfaches Beispiel, für Anweisungen meine Probleme. Mein Code ist ein bisschen komplizierter und daher kann ich die Datei vor dem Verzweigen nicht schließen. Ob es möglich ist, einen Kindprozess zu unterdrücken, erben Dateideskriptor? – deniska369

+0

Der Subprozess kann es schließen, wenn Sie erwarten, dass es sich um einen lang andauernden Prozess handelt und wenn die mehreren Dateizugriffe ein zusätzliches Problem verursachen. – Owen

+1

Ok, ich habe eine Lösung gefunden. Need setup close_fds = Wahr in subprocess.Popen. Vielen Dank für Ihre Antwort – deniska369

1

Bis Sie rufen test2 Ihr test1 Programm bereits die Datei . Wenn Sie einen Unterprozess erstellen, übernimmt dieser untergeordnete Prozess daher alle geöffneten Dateien - einschließlich File.txt.

Siehe notes on file inheritance in der Dokumentation für subprocess.

+0

Kann ich verbieten, dass der untergeordnete Prozess diese geöffnete Datei erbt? – deniska369

+0

Ok, ich habe eine Lösung gefunden. Need setup close_fds = Wahr in subprocess.Popen. Ich danke Ihnen sehr für Ihre Antwort – deniska369