2016-08-02 2 views
2

subprocess.Popenを使用している場合、私は(例えば)スクリプトtest1.pyを持っている別のスクリプト

import test2 


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

    while True: 
     pass 

if __name__ == '__main__': 
    main() 

そして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() 

を実行するためにPythonが二回に問題があることであるファイルを開きます2番目のスクリプトを起動すると、ファイル "File.txt"が再び開きます。起動時の2番目のスクリプトがファイルを開くのはなぜですか?

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 

答えて

1

子プロセスは、(より詳細な説明についてPEP 446を参照してください)Unixのモデルとの互換性のためにファイルハンドルを継承します。サブプロセス呼び出しの後、元のスクリプトと新しいスクリプトの両方がファイルにアクセスできる必要があります。 Windowsでは、2つの別々のファイルハンドルが開いていることを意味します。

より良いイディオムあなたは、これは明示的またはwith構文を使用して、フォークの前にファイルを閉じることで避けたい場合:

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

私は簡単な例を教えてくれました。私のコードはもう少し複雑なので、フォークする前にファイルを閉じることはできません。子プロセスを抑制することが可能かどうかは、ファイル記述子を継承しますか? – deniska369

+0

サブプロセスは、長時間実行されるプロセスであり、複数のファイルハンドルが追加の問題を引き起こしていると思われる場合は、そのプロセスを閉じることができます。 – Owen

+1

さて、私は解決策を見つけました。サブプロセスでclose_fds = Trueを設定する必要があります。 – deniska369

1

あなたのtest1プログラムがファイルを既にオープンしているtest2呼び出す時まで。そのため、子プロセスが子プロセスを作成したときには、その子プロセスは開いているファイルを継承します(File.txtを含む)。

subprocessのマニュアルのnotes on file inheritanceを参照してください。

+0

子プロセスがこのオープンファイルを継承することを禁じることはできますか? – deniska369

+0

私は解決策を見つけました。サブプロセスでclose_fds = Trueを設定する必要があります。ご回答どうもありがとうございました – deniska369

関連する問題