【发布时间】:2016-06-30 21:17:33
【问题描述】:
我有一个脚本 (Python),它使用子进程调用另一个脚本。父脚本同时写入控制台和日志文件(我使用this question接受的答案中的代码来拆分输出),但子进程打印语句只会写入标准输出,不会写入日志文件。
我确实知道这是为什么:子进程将标准输出设置为普通标准输出,而不是父进程具有的特殊 tee 对象。我尝试将 tee 对象作为参数传递给子进程,但我学到了不能将对象作为参数传递给子进程的艰难方法。我的备份计划是传入要写入的文件的路径字符串,然后让子进程使用同一个文件创建自己的 tee 对象。
我的问题是,如果两个进程同时写入同一个文件,输出会不会混乱?我在父进程中使用 open("file", 'w') ,首先调用它,我在子进程中使用 open("file", 'a') 。假设,该文件应该以正确的顺序包含打印语句的输出,因为附加到带有“a”的文件意味着这些行将始终添加到当前文件的末尾,不是吗?或者是否有关于打开文件的规则阻止它被2个进程同时打开?
POST_TEST:我自己做了一些测试后,发现如下: -您可以连续多次打开("file", 'w') - 你可以先打开("file", 'w') 然后再打开("file", 'a') -在第一种情况下,子进程完全覆盖文件。 -第二种情况,顺序不正确,好像丢失了一些输出。
然后我的新问题是,我应该使用什么替代解决方案同时从父进程和子进程写入文件,而不会出现乱序或重叠的行?
【问题讨论】:
-
谷歌“互斥锁”。互斥锁是对资源的互斥锁,可避免两个进程使用同一资源时发生冲突。
-
以
a模式打开的进程总是会写在文件的末尾。但是以w模式打开的那个不会。您需要在a模式下打开它们。 -
@JuanTomas 实际上我去年在 C++ 课程中了解了互斥锁,没想到在这里使用。感谢您的提示
-
在父进程中打开后调用
file.truncate()。
标签: python subprocess stdout tee