启动不阻止父重定向到的文件的子进程
Start subprocess that does not block files the parent redirects to
我正在尝试生成一个在主进程关闭后仍应 运行 的子进程。这部分工作正常,但是如果我将这个过程的输出重定向到一个文件,我就无法再次启动脚本,因为该过程仍然阻塞日志文件。
这个简短的例子说明了这个问题:
在这种情况下,第二个进程是 "notepad" 并由 "other.cmd" 启动。而主要的 process/script 是由 "start_it.cmd".
启动的 "test_it.py"
start_it.cmd
@python test_it.py > test.log
test_it.py
import subprocess
from subprocess import DEVNULL, STDOUT
subprocess.Popen(["other.cmd"], stdin=DEVNULL, stdout=DEVNULL, stderr=STDOUT)
other.cmd
start notepad
第二次执行start_it.cmd
时,将失败并显示此错误消息"The process cannot access the file because it is being used by another process"。
如何启动子进程以使其不阻塞日志文件?
使用管道的解决方案。
multiplexer.py
with open('log.txt', 'a') as outputFile:
while True:
data = sys.stdin.read(1024)
if None == data:
break
outputFile.write(data)
start_it.cmd
@python test_it.py | python multiplexer.py
其他一切保持不变。
我找到了一个接近我最初预期的解决方案:
subprocess.Popen("explorer other.cmd", shell=True)
通过让资源管理器启动 .cmd 文件,这成功地将调用的 .cmd 从原始进程中分离出来。因此不会保持日志文件打开。
我正在尝试生成一个在主进程关闭后仍应 运行 的子进程。这部分工作正常,但是如果我将这个过程的输出重定向到一个文件,我就无法再次启动脚本,因为该过程仍然阻塞日志文件。
这个简短的例子说明了这个问题: 在这种情况下,第二个进程是 "notepad" 并由 "other.cmd" 启动。而主要的 process/script 是由 "start_it.cmd".
启动的 "test_it.py"start_it.cmd
@python test_it.py > test.log
test_it.py
import subprocess
from subprocess import DEVNULL, STDOUT
subprocess.Popen(["other.cmd"], stdin=DEVNULL, stdout=DEVNULL, stderr=STDOUT)
other.cmd
start notepad
第二次执行start_it.cmd
时,将失败并显示此错误消息"The process cannot access the file because it is being used by another process"。
如何启动子进程以使其不阻塞日志文件?
使用管道的解决方案。 multiplexer.py
with open('log.txt', 'a') as outputFile:
while True:
data = sys.stdin.read(1024)
if None == data:
break
outputFile.write(data)
start_it.cmd
@python test_it.py | python multiplexer.py
其他一切保持不变。
我找到了一个接近我最初预期的解决方案:
subprocess.Popen("explorer other.cmd", shell=True)
通过让资源管理器启动 .cmd 文件,这成功地将调用的 .cmd 从原始进程中分离出来。因此不会保持日志文件打开。