IPython和Python有什么区别?

2 投票
2 回答
802 浏览
提问于 2025-04-16 20:16

我最近在尝试使用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就是从那里调用的。

撰写回答