我在两个脚本文件中成功使用mathematical modelling package coopr.pyomo
,并在ipython控制台上以交互方式使用Installation Notes import coopr.pyomo
。但是,如果我在ipython notebook
启动的IPython笔记本中尝试一个简单的ImportError Traceback (most recent call last)
<ipython-input-1-ff8219fceacd> in <module>()
----> 1 import coopr.pyomo
ImportError: No module named pyomo
,我会收到以下错误消息:
__file__
其他导入(buitlins和自定义包)都可以顺利运行。任何寻找原因的想法?
环境:Windows 7上的Python 2.7(32位),IPython 0.13.2,Coopr版本3.2.6148。
编辑:更多诊断
实际上,coopr可以导入,但没有__dict__
属性。如果我显示{'__name__': 'coopr',
'data': <module 'coopr.data' (built-in)>,
'__doc__': None,
'__path__': ['C:\\Python27\\lib\\site-packages\\coopr']}
,我会得到正确的路径:
src
如果我在该目录中浏览,我发现所有子模块(例如coopr.pyomo)都位于data
子目录中。 C:/Packages/Coopr
似乎是一个虚假的目录,包含一些测试(test_baselines.py,test_perf.py)和示例(diet1.py)文件。
编辑#2:它越来越近(我认为)
这个问题似乎是由Coopr的Windows安装程序如何工作的特殊方式引起的。根据{{3}},Coopr封装在自己的虚拟沙箱中。其默认安装目录建议 CH := site-packages
强调了这一点。上次,我忽略了这个标志,只是将它安装到Python的sys.path
文件夹中。现在,为了测试,我将Coopr重新安装到这个外部目录。 Coopr / Pyomo仍然可以在(I)Python会话中成功导入,因为/src/
由 CH __init__.py
目录的所有子目录扩展。
但是,这些子目录看起来与我习惯的其他包不同。例如,src / coopr.pyomo只包含setup.py,而/src/coopr.pyomo/coopr/pyomo
位于 CH {{1}}。虽然IPython似乎能够找到软件包,但IPython笔记本 - 尽管搜索路径相同 - 似乎对软件包的组织方式感到困惑。
答案 0 :(得分:1)
我必须猜测,但是:
在笔记本中尝试以下内容:
import coopr
print coopr.__file__
看起来您正在选择与已安装的模块不同的coopr
模块,__file__
属性应该告诉您正在使用哪个模块。也许有一个名为coopr
的脚本;这样的脚本不包含子模块pyomo
。
为什么这只发生在IPython笔记本中,而不是在IPython控制台中?我的猜测是,如果确实存在不同的coopr
模块,它将存在于您的主目录或IPython笔记本用作其“基础”的系统上的其他位置。 IPython控制台基本目录是您启动它的地方,但IPython笔记本可能已经解耦并且具有默认的基本目录。我不知道笔记本是如何在Windows下运行的,所以我不能告诉你默认是什么以及在哪里看,但上面的代码可以很好地告诉你。
答案 1 :(得分:0)
感谢@Evert指出我正确的方向。这个问题是由我(粗心)将Coopr安装到我的Python安装的site-packages
目录中引起的。自我注意:不要那样做。虽然IPython本身设法找到了包,但IPython笔记本的搜索路径却被混淆了,并且像其他任何包文件夹一样对待coopr
目录。
将Coopr重新安装到其建议位置在我的Python安装目录之外,从site-packages
删除coopr目录,然后重新启动,一切正常。