[CPyUG] 如何在Python中关闭sys.stdout, sys.stderr?

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

[CPyUG] 如何在Python中关闭sys.stdout, sys.stderr?

li zJay
test.py:
------------------------------
import sys

sys.stdout.close()
sys.stderr.close()
raw_input()

-----------------------------
运行test.py, 然后
$ ls -al  /proc/PID/fd
你会发现0, 1, 2的fd都没有被关闭

只有通过类似 os.close(sys.stdout.fileno())的底层方法才能把fd关闭,但这样做
有点太粗暴而且繁琐,因为好像Python官方文档里说关闭一个file object对象,
fd会被释放(经测试:文件,Socket,Pipe在调用close方法后其fd的确会释放)。

求解~

--
祝好

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
发言: [hidden email]
退订: [hidden email] (向此发空信即退!)
详情: http://groups-beta.google.com/group/python-cn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: [CPyUG] 如何在Python中关闭sys.stdout, sys.stderr?

victor lee-3
也许是因为python是解释调用,process name 都是python,所以fd不能关吧?

2010/9/4 li zJay <[hidden email]>
test.py:
------------------------------
import sys

sys.stdout.close()
sys.stderr.close()
raw_input()

-----------------------------
运行test.py, 然后
$ ls -al  /proc/PID/fd
你会发现0, 1, 2的fd都没有被关闭

只有通过类似 os.close(sys.stdout.fileno())的底层方法才能把fd关闭,但这样做
有点太粗暴而且繁琐,因为好像Python官方文档里说关闭一个file object对象,
fd会被释放(经测试:文件,Socket,Pipe在调用close方法后其fd的确会释放)。

求解~

--
祝好

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
发言: [hidden email]
退订: [hidden email] (向此发空信即退!)
详情: http://groups-beta.google.com/group/python-cn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
发言: [hidden email]
退订: [hidden email] (向此发空信即退!)
详情: http://groups-beta.google.com/group/python-cn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: [CPyUG] 如何在Python中关闭sys.stdout, sys.stderr?

Shell Xu
In reply to this post by li zJay
这个,虽然你关闭了sys.stdout,但是python解释器自己还得用啊。
所以正确的关闭方法是,先关闭sys.stdout(其实赋值None就可以了),以防错误访问。
然后os.close。

在 2010年9月4日 下午10:39,li zJay <[hidden email]>写道:
test.py:
------------------------------
import sys

sys.stdout.close()
sys.stderr.close()
raw_input()

-----------------------------
运行test.py, 然后
$ ls -al  /proc/PID/fd
你会发现0, 1, 2的fd都没有被关闭

只有通过类似 os.close(sys.stdout.fileno())的底层方法才能把fd关闭,但这样做
有点太粗暴而且繁琐,因为好像Python官方文档里说关闭一个file object对象,
fd会被释放(经测试:文件,Socket,Pipe在调用close方法后其fd的确会释放)。

求解~

--
祝好

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
发言: [hidden email]
退订: [hidden email] (向此发空信即退!)
详情: http://groups-beta.google.com/group/python-cn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp



--
无能者无所求,饱食而遨游,泛若不系之舟

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
发言: [hidden email]
退订: [hidden email] (向此发空信即退!)
详情: http://groups-beta.google.com/group/python-cn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

[CPyUG] Re: 如何在Python中关闭sys.stdout, sys.stderr?

chunlin zhang
挖一下老帖,刚才碰到一个问题使用 std.stderr = None 的办法不能正常工作,找到这个解决方案:
'''
重定向 stdout/stderr 文件, 而不能只是简单地关闭它们(如果你的程序需要 stdout 或 stderr 写入内容的时候, 可能
会出现意想不到的问题).

class NullDevice:
    def write(self, s):
        pass
sys.stdin.close()
sys.stdout = NullDevice()
sys.stderr = NullDevice()
'''
from: http://users.tpg.com.au/ludingji/downloads/PyStdLib.html

On Sep 4 2010, 11:30 pm, Shell Xu <[hidden email]> wrote:

> 这个,虽然你关闭了sys.stdout,但是python解释器自己还得用啊。
> 所以正确的关闭方法是,先关闭sys.stdout(其实赋值None就可以了),以防错误访问。
> 然后os.close。
>
> 在 2010年9月4日 下午10:39,li zJay <[hidden email]>写道:
>
>
>
>
>
>
>
>
>
> > test.py:
> > ------------------------------
> > import sys
>
> > sys.stdout.close()
> > sys.stderr.close()
> > raw_input()
>
> > -----------------------------
> > 运行test.py, 然后
> > $ ls -al  /proc/PID/fd
> > 你会发现0, 1, 2的fd都没有被关闭
>
> > 只有通过类似 os.close(sys.stdout.fileno())的底层方法才能把fd关闭,但这样做
> > 有点太粗暴而且繁琐,因为好像Python官方文档里说关闭一个file object对象,
> > fd会被释放(经测试:文件,Socket,Pipe在调用close方法后其fd的确会释放)。
>
> > 求解~
>
> > --
> > 祝好
>
> >  --
> > 来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
> > 发言: [hidden email]
> > 退订: [hidden email] (向此发空信即退!)
> > 详情:http://groups-beta.google.com/group/python-cn
> > 严正: 理解列表! 智慧提问!http://wiki.woodpecker.org.cn/moin/AskForHelp
>
> --
> 无能者无所求,饱食而遨游,泛若不系之舟

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: [hidden email]
退订: [hidden email] (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: [CPyUG] Re: 如何在Python中关闭sys.stdout, sys.stderr?

crisman
stdout='/dev/null' , stderr='/dev/null' 

在 2011年12月31日 下午3:45,Chunlin Zhang <[hidden email]>写道:
挖一下老帖,刚才碰到一个问题使用 std.stderr = None 的办法不能正常工作,找到这个解决方案:
'''
重定向 stdout/stderr 文件, 而不能只是简单地关闭它们(如果你的程序需要 stdout 或 stderr 写入内容的时候, 可能
会出现意想不到的问题).

class NullDevice:
   def write(self, s):
       pass
sys.stdin.close()
sys.stdout = NullDevice()
sys.stderr = NullDevice()
'''
from: http://users.tpg.com.au/ludingji/downloads/PyStdLib.html

On Sep 4 2010, 11:30 pm, Shell Xu <[hidden email]> wrote:
> 这个,虽然你关闭了sys.stdout,但是python解释器自己还得用啊。
> 所以正确的关闭方法是,先关闭sys.stdout(其实赋值None就可以了),以防错误访问。
> 然后os.close。
>
> 在 2010年9月4日 下午10:39,li zJay <[hidden email]>写道:
>
>
>
>
>
>
>
>
>
> > test.py:
> > ------------------------------
> > import sys
>
> > sys.stdout.close()
> > sys.stderr.close()
> > raw_input()
>
> > -----------------------------
> > 运行test.py, 然后
> > $ ls -al  /proc/PID/fd
> > 你会发现0, 1, 2的fd都没有被关闭
>
> > 只有通过类似 os.close(sys.stdout.fileno())的底层方法才能把fd关闭,但这样做
> > 有点太粗暴而且繁琐,因为好像Python官方文档里说关闭一个file object对象,
> > fd会被释放(经测试:文件,Socket,Pipe在调用close方法后其fd的确会释放)。
>
> > 求解~
>
> > --
> > 祝好
>
> >  --
> > 来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
> > 发言: [hidden email]
> > 退订: [hidden email] (向此发空信即退!)
> > 详情:http://groups-beta.google.com/group/python-cn
> > 严正: 理解列表! 智慧提问!http://wiki.woodpecker.org.cn/moin/AskForHelp
>
> --
> 无能者无所求,饱食而遨游,泛若不系之舟

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: [hidden email]
退订: [hidden email] (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: [hidden email]
退订: [hidden email] (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

[CPyUG] Re: 如何在Python中关闭sys.stdout, sys.stderr?

Shell Xu
In reply to this post by chunlin zhang

恩,对,单纯none掉有的程序会抛出异常。
还是根据具体情况分别处理比较好。

from miui

在 2011-12-31 上午7:45,"Chunlin Zhang" <[hidden email]>写道:
挖一下老帖,刚才碰到一个问题使用 std.stderr = None 的办法不能正常工作,找到这个解决方案:
'''
重定向 stdout/stderr 文件, 而不能只是简单地关闭它们(如果你的程序需要 stdout 或 stderr 写入内容的时候, 可能
会出现意想不到的问题).

class NullDevice:
   def write(self, s):
       pass
sys.stdin.close()
sys.stdout = NullDevice()
sys.stderr = NullDevice()
'''
from: http://users.tpg.com.au/ludingji/downloads/PyStdLib.html

On Sep 4 2010, 11:30 pm, Shell Xu <[hidden email]> wrote:
> 这个,虽然你关闭了sys.stdout,但是python解释器自己还得用啊。
> 所以正确的关闭方法是,先关闭sys.stdout(其实赋值None就可以了),以防错误访问。
> 然后os.close。
>
> 在 2010年9月4日 下午10:39,li zJay <[hidden email]>写道:
>
>
>
>
>
>
>
>
>
> > test.py:
> > ------------------------------
> > import sys
>
> > sys.stdout.close()
> > sys.stderr.close()
> > raw_input()
>
> > -----------------------------
> > 运行test.py, 然后
> > $ ls -al  /proc/PID/fd
> > 你会发现0, 1, 2的fd都没有被关闭
>
> > 只有通过类似 os.close(sys.stdout.fileno())的底层方法才能把fd关闭,但这样做
> > 有点太粗暴而且繁琐,因为好像Python官方文档里说关闭一个file object对象,
> > fd会被释放(经测试:文件,Socket,Pipe在调用close方法后其fd的确会释放)。
>
> > 求解~
>
> > --
> > 祝好
>
> >  --
> > 来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
> > 发言: [hidden email]
> > 退订: [hidden email] (向此发空信即退!)
> > 详情:http://groups-beta.google.com/group/python-cn
> > 严正: 理解列表! 智慧提问!http://wiki.woodpecker.org.cn/moin/AskForHelp
>
> --
> 无能者无所求,饱食而遨游,泛若不系之舟

--
来自: python-cn`CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
发言: [hidden email]
退订: [hidden email] (向此发空信即退!)
详情: http://code.google.com/p/cpyug/wiki/PythonCn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
强烈: 建议使用技巧: 如何有效地报告Bug http://www.chiark.greenend.org.uk/%7Esgtatham/bugs-cn.html
Loading...