如果使用subprocess.Popen运行另一个脚本,Python会两次打开一个文件

时间:2016-08-02 10:58:37

标签: python 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()

问题是第二个脚本的启动重新打开文件“File.txt”。为什么启动时的第二个脚本会打开文件?

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

2 个答案:

答案 0 :(得分:1)

子进程继承了一个文件句柄,以便与Unix模型兼容(有关更多说明,请参阅PEP 446)。在子进程调用之后,原始脚本和新脚本都应该有权访问该文件;在Windows上,这意味着打开两个单独的文件句柄。

如果你想避免这种情况,更好的习惯用法是在分叉之前关闭文件,无论是显式还是使用with结构:

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

答案 1 :(得分:1)

当您致电test2时,您的test1程序已经打开了该文件。因此,当您创建子进程时,子进程会继承任何打开的文件 - 包括File.txt

请参阅subprocess文档中的notes on file inheritance