python进程标准输出到一个不工作的文件

2024-09-25 04:30:46 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑一下代码

更新

def proc1():
    #do something
def proc2():
    #do something else

f1 = open("log1","w")
f2 = open("log2","w")

sys.stdout = f1
p1 = threading.Thread(target = proc1)
p1.start()
sys.stdout = f2
p2 = threading.Thread(target = proc2)
p2.start()
p1.join()
p2.join()

当我运行这个,什么都没有被记录,是什么问题,任何基本的错误??你知道吗


Tags: targetdefstdoutsysopendothreadsomething
2条回答

我会给你一个建议。如果要保存sys.stdout,请在以下时间之前保存:save_stdout = sys.stdout

更换后系统标准输出,可以使用sys.stdout = save_stdout撤消更改。现在,我们来看看代码。当txt文件打开时,你看不到任何结果。因此,请关闭文件并观看:

def proc1():
    #do something
def proc2():
    #do something else

save_stdout = sys.stdout
f1 = open("log1","w")
f2 = open("log2","w")

sys.stdout = f1
p1 = threading.Thread(target = proc1)
p1.start()
sys.stdout = f2
p2 = threading.Thread(target = proc2)
p2.start()
p1.join()
p2.join()
f1.close()
f2.close()
sys.stdout = save_stdout

您可以关闭主脚本中的文件,也可以关闭函数proc1和proc2中的文件。你知道吗

问题可能是python在线程之间共享模块。所以sys模块是p1p2中的相同的sys模块。当您将sys.stdout设置为f2时,两个线程都将写入该线程,而不是它们自己的线程。我可以想象所有的东西都被写入了log2,除了在proc1中发生的任何事情,在您启动is之后,在python将sys.stdout设置为f2之前。你知道吗

什么会更。。。通常的方法是将文件句柄传递给线程,而不会使事情变得更复杂:

def proc1(logfile=sys.stdout):
    # do stuff
    logfile.write("use this, f.write, rather than print...")
    # do more stuff...

f1 = open("test", "a")
p1 = threading.Thread(target=proc1, args=(f1,))
p1.start()

# ...

这应该很管用。你知道吗

我还建议您将所有初始化内容(打开文件句柄、启动线程等)放入函数中。叫它main什么的。然后,您可以通过将以下内容放在文件末尾来启动此函数:

if __name__ == '__main__':
    main()

这样,如果您想切换到http://docs.python.org/2/library/multiprocessing.html库就容易多了(如果您要做的事情是在python的GIL中相互阻塞,并且您实际上需要单独的进程,而不仅仅是线程)。你知道吗

相关问题 更多 >