【发布时间】:2013-08-31 17:56:17
【问题描述】:
谁能解释为什么导入 cv 和 numpy 会改变 python 的 struct.unpack 的行为?这是我观察到的:
Python 2.7.3 (default, Aug 1 2012, 05:14:39)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from struct import pack, unpack
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44
这是正确的
>>> import cv
libdc1394 error: Failed to initialize libdc1394
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44
还是可以的,导入cv后
>>> import numpy
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44
导入cv然后numpy后就OK了
现在我重新启动 python:
Python 2.7.3 (default, Aug 1 2012, 05:14:39)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from struct import pack, unpack
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44
>>> import numpy
>>> unpack("f",pack("I",31))[0]
4.344025239406933e-44
到目前为止一切顺利,但现在我在导入 numpy 之后导入 cv:
>>> import cv
libdc1394 error: Failed to initialize libdc1394
>>> unpack("f",pack("I",31))[0]
0.0
我已经重复了很多次,包括在多台服务器上,而且总是以同样的方式进行。我也用 struct.unpack 和 struct.pack 试过,也没什么区别。
我无法理解导入 numpy 和 cv 如何对 struct.unpack 的输出产生任何影响(顺便说一句,pack 保持不变)。
我相信“libdc1394”是一个红鲱鱼:ctypes error: libdc1394 error: Failed to initialize libdc1394
有什么想法吗?
tl;dr: 导入 numpy 然后 opencv 会改变 struct.unpack 的行为。
更新:保罗在下面的回答表明这是可重现的。 Seborg 的评论表明这与 python 处理次常态的方式有关,这听起来很合理。我查看了Contexts 但这似乎不是问题,因为导入之后的上下文与之前的上下文相同。
【问题讨论】:
-
这对您没有帮助,只是为了便于阅读和简化问题,
unpack("f",pack("I",31))会产生相同的结果吗? -
@PauloAlmeida:好点。刚刚试了一下——是的,结果一样...我将编辑问题以使其更易于阅读...