意外的from/import语句行为

大家好 !
我正在尝试捕获我在Python中使用的外部模块的stderr
程序.我正在这样做
通过在我的模块中设置类覆盖stderr文件对象
方法写.
外部模块以这种方式输出到stderr:
从系统导入std err
..... .....
打印> stderr,"一些文本"
在我的模块中我使用
导入系统
..... sys.stderr ... sys.stdout
好吧,只要我不更改外部模块,
导入语句仅
导入系统
..... .....
打印> sys.stderr,"一些文本"
我无法捕获它的stderr,当然我不想
做这种改变.
我一直相信使用两种方式的等效性
导入语句
但是很明显我错了:-(
拜托,有人可以告诉我发生了什么事?
提前致谢 !

# 回答1


NISP Schrieb:
http://effbot.org/zone/import-confusion.htm
diez
# 回答2


nisp Python 2.5.2(R252:60911,Jul 31 2008,17:28:52)
[GCC 4.2.3(Ubuntu 4.2.3-2ubuntu7)]在Linux2上
键入"帮助","版权","学分"或"许可"以获取更多信息.
真的
行为,我也发现两者之间也没有区别.
您能剪切并粘贴一个最小的例子,而不是产生
正确的行为,也许提到您正在使用的是哪种操作系统?
# 回答3


Alex23 Schrieb:
Python 2.5.2(R252:60911,Jul 31 2008,17:28:52)
[GCC 4.2.3(Ubuntu 4.2.3-2ubuntu7)]在Linux2上
键入"帮助","版权","学分"或"许可"以获取更多信息.
真的
行为,我也发现两者之间也没有区别.
您能剪切并粘贴一个最小的例子,而不是产生
正确的行为,也许提到您正在使用的是哪种操作系统?
您没有阅读本文的这一部分:
"""
我无法捕获它的stderr,当然我不想
做这种改变.
"""
他试图将sys.stderr设置为新流并捕获印刷品
陈述,但没有这样做,因为他创建了当地别名.
diez
# 回答4


NISP写道:
一种补充Diez与解释的链接的实用方法:
而不是修改外部模块,您可以重定向stderr
在导入外部模块之前
导入系统
sys.stderr =随便
导入外部
或猴子点:
导入系统
导入外部
sys.stderr = external.sterr =
彼得
# 回答5


8月27日,上午9:56,彼得·奥特(Peter Otten)<__ pete ...@web.dewrote:
一种补充Diez与解释的链接的实用方法:
而不是修改外部模块,您可以重定向stderr
在导入外部模块之前
导入系统
sys.stderr =随便
导入外部
或猴子点:
导入系统
导入外部
sys.stderr = external.sterr =
彼得
大家好 !
首先谢谢!我读了有趣的diez的链接
在我看来,仍然不清楚,另一方面很明显我
问题集中在那里,符号.
这就是我 试图做
helloworld.py:这是我外部模块的真正简化
虽然仍反映其结构(评论是版本
假设有效)
从系统导入stderr
#IMPORT SYS
班级欢呼:
def __init __(自我):
self.cheersmsg ='Hello World !!'
打印" Cheers stderr%s"%stderr
#print" cheers stderr%s"%sys.stderr
def _putcheers(self):
打印>> stderr,"这是我的味精:',self.cheersmsg
打印>> stderr,"今天是美好的一天!!!"
#print >> sys.stderr,"这是我的味精:',self.cheersmsg
#print >> sys.stderr,"今天是美好的一天!!!"
DEF DOSOMESTUFF(自我):
self._putcheers()
在下面是使用上述一个(mymodule.py)的模块:
#!/usr/bin/python
导入系统
来自Helloworld Import *
stderrcatcher类:
def __init __(自我):
self.data =''
def写(自我,东西):
self.data = self.data +" \ t" +东西
def main():
打印" mymodule stderr:%s"%sys.stderr
sys.stderr = stderr = stderrcatcher()
M = Cheers()
m.dosomestuff()
打印" stderr:\ n%s"%sys.stderr.data
如果__name__ =='__ main __':
主要的()
下方有输出不起作用的输出:
myModule stderr:',模式'W'at 0xb7d160b0>
Cheers stderr <打开文件'',模式'w'at 0xb7d160b0>
这是我的味精:你好世界!
今天是美好的一天!
stderr:
在这里工作时:
myModule stderr:<打开文件'',模式'w'at 0xb7dc40b0>
Cheers stderr <__ Main __.stderrcatcher实例在0xB7D8BD4C>
stderr:
这是我的味精:你好世界!
今天是美好的一天!
再次感谢!
PS抱歉,可能直接回复了您的Somone :-(
# 回答6


NISP写道:一种补充Diez链接到解释的实用方法:您可以在导入外部模块syssys.stderr = whythingimport nother portheror monkey-patch之前,您可以重定向stderrbe,又可以重定向stderrbe = whyingpeter

大家好 !
首先谢谢!我读了有趣的diez的链接
在我看来,仍然不清楚,另一方面很明显我
问题集中在那里,符号.
这是我想做的
helloworld.py:这是我外部模块的真正简化
虽然仍反映其结构(评论是版本
假设有效)
从系统导入stderr
这是你的问题.您为对象创建一个helloworld.stderr-alias
绑定到sys.stderr.重新固定后者不会影响前者.那是
正是我给您的链接解释了什么.
整个问题的简短答案是:不要使用Import语法
直到您真的知道自己在做什么.或者根本没有.
diez

# 回答7


8月27日,下午2:43," Diez B. Roggisch" 这是你的问题.您为对象创建一个helloworld.stderr-alias
绑定到sys.stderr.重新固定后者不会影响前者.那是
恰恰是我的链接 给你解释.
整个问题的简短答案是:不要使用Import语法
直到您真的知道自己在做什么.或者根本没有.
迪兹
嗨,迪兹!我现在很好地了解了这个问题,事实是
不幸的是,外部模块不是我的,我怀疑我可以更改
它:-(无论如何,就我而言,我学到了教训!
再次问候,
NISP
# 回答8


NISP写道:
再次阅读.如果您有两个模块
模块1.py
从系统导入stderr
module2.py
来自Module1 Import stderr
您在三个不同的名称空间中获得三个名称" stderr",每个名称
可以绑定另一个对象.
这是导入helloworld.stderr:
您现在在模块__ main __中具有全局变量的" stderr",初始化为
与helloworld.stderr相同的值.
这重现了sys.stderr和main()中的本地" stderr"
但是Helloworld.stderr和__ Main __. stderr都没有受到影响.您需要什么

导入helloworld
sys.stderr = helloworld.stderr = stderrcatcher()
# 回答9


8月27日,5:42*PM," Diez B. Roggisch" 真的

您没有阅读本文的这一部分:
"""
我无法捕获它的stderr,当然我不想
做这种改变.
"""
他试图将sys.stderr设置为新流并捕获印刷品
陈述,但没有这样做,因为他创建了当地别名.
不,我读了,我只是完全没有这样解析:)
对不起,这种困惑,NISP.

# 回答10


8月27日,下午3:35,Peter Otten <__ Pete ...@web.dewrote:
再次阅读.如果您有两个模块
模块1.py
从系统导入stderr
module2.py
来自Module1 Import stderr
您在三个不同的名称空间中获得三个名称" stderr",每个名称
可以绑定另一个对象.
这是导入helloworld.stderr:
您现在在模块__ main __中具有全局变量的" stderr",初始化为
与helloworld.stderr相同的值.
这重现了sys.stderr和main()中的本地" stderr"
但是Helloworld.stderr和__ Main __. stderr都没有受到影响.您需要什么

导入helloworld
sys.stderr = helloworld.stderr = stderrcatcher()
嗨,彼得!
绝对是对的!可能是我完全理解的
主题(或可能不是吗?...天哪!)...我不认为
"来自mymodule.py中的"来自hellowolrd Import *".
现在我的模块是:
导入系统
导入helloworld
stderrcatcher类:
def __init __(自我):
self.data =''
def写(自我,东西):
self.data = self.data +" \ t" +东西
def main():
打印" mymodule stderr:%s"%sys.stderr
mystderr = sys.stderr = helloworld.stderr = stderrcatcher()
m = helloworld.cheers()
m.dosomestuff()
打印>> sys.stderr," mymodule打印某些东西"
打印" stderr:\ n%s"%mystderr.data
如果__name__ =='__ main __':
主要的()
它的输出是:
myModule stderr:',模式'W'at 0xb7d2d0b0>
Cheers stderr <__ Main __.stderrcatcher实例在0xb7cf4e4c>
stderr:
这是我的味精:你好世界!
今天是美好的一天! MyModule打印一些东西 现在它可以很好地工作! 伟大的 ! 感谢大家 ! NISP

标签: python

添加新评论