我有脚本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
答案 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。