IPython和Python有什么区别?
我最近在尝试使用PyMC,并写了一个很简单的mcmceasy.py脚本。有趣的是,这个脚本在IPython中运行得很好,但当我直接用Python运行时,却出现了以下错误信息:
Traceback (most recent call last):
File "mcmceasy.py", line 2, in <module>
from pymc import MvNormal, MCMC
File "/usr/lib/python2.7/site-packages/pymc/__init__.py", line 55, in <module>
import ScipyDistributions
File "/usr/lib/python2.7/site-packages/pymc/ScipyDistributions.py", line 1, in <module>
import scipy.stats.distributions as sc_dst
File "/usr/lib/python2.7/site-packages/scipy/stats/__init__.py", line 12, in <module>
import mstats
File "/usr/lib/python2.7/site-packages/scipy/stats/mstats.py", line 3, in <module>
from mstats_basic import *
File "/usr/lib/python2.7/site-packages/scipy/stats/mstats_basic.py", line 52, in <module>
import scipy.misc as misc
File "/usr/lib/python2.7/site-packages/scipy/misc/__init__.py", line 20, in <module>
__all__ += common.__all__
NameError: name 'common' is not defined
我有两个问题:1. 如何在普通的Python环境中解决这个问题? 2. 为什么IPython没有出现这个错误?
2 个回答
0
我从来没有用过pymc,但首先要确认一下ipython和你系统里的python是不是在用同一个环境。不过我怀疑pymc只是利用了scipy的一些功能,这些功能需要特定的ipython并行计算特性。所以如果真是这样的话,第一部分可能会很难。
2
当然,我没有你的脚本,但我在Windows、Linux和OSX的2.6和2.7版本的Python中,成功运行了你提到的导入操作,在IPython和Python中都没有出现你所说的错误。
不过,看一下“scipy/misc/init.py”文件,发现里面并没有导入common这个名字。
from common import *
#...more stuff
__all__ += common.__all__
这段代码能正常工作,说明common是在其他地方被导入的。在scipy.__init__.py
文件中,PackageLoader是从numpy导入的,它做了一些复杂的操作,比如检查调用栈中的路径等等。
IPython和Python的导入方式是不同的,特别是如果你使用了pylab这个选项的话。这就导致了IPython和Python之间的差异。我建议你单独尝试上面的导入操作。在PyMC之前先调用一次导入,可能会是一个解决办法。
另外,你应该提供一下你使用的numpy版本,因为PackageLoader就是从那里调用的。