0

我在脚本文件和 ipython 控制台上以交互方式成功使用了数学建模包。 但是,如果我在以 开头的 IPython 笔记本中coopr.pyomo尝试简单的操作,则会收到以下错误消息:import coopr.pyomoipython notebook

ImportError                               Traceback (most recent call last)
<ipython-input-1-ff8219fceacd> in <module>()
----> 1 import coopr.pyomo

ImportError: No module named pyomo

其他导入(buitlins 和自定义包)可以毫无问题地工作。任何想法在哪里寻找原因?

环境:Windows 7 上的 Python 2.7(32 位),IPython 0.13.2,Coopr 版本 3.2.6148。

编辑:更多诊断

事实上, coopr 可以导入,但没有__file__属性。如果我显示__dict__,我得到正确的路径:

{'__name__': 'coopr', 
 'data': <module 'coopr.data' (built-in)>, 
 '__doc__': None, 
 '__path__': ['C:\\Python27\\lib\\site-packages\\coopr']}

如果我浏览该目录,我会发现所有子模块(例如 coopr.pyomo)都位于该src子目录中。data似乎是一个包含一些测试(test_baselines.py、test_perf.py)和示例(diet1.py)文件的虚假目录。

编辑#2:它越来越近(我认为)

这个问题似乎是由 Coopr 的 Windows 安装程序的工作方式的特殊方式引起的。根据安装说明,Coopr 封装在自己的虚拟沙箱中。其默认安装目录建议CH :=强调了这一点C:/Packages/Coopr。上次,我忽略了这个标志,只是将它安装到 Python 的site-packages文件夹中。现在,为了测试,我将 Coopr 重新安装到了这个外部目录。Coopr/Pyomo 仍然可以从 (I)Python 会话中成功导入,正如CHsys.path目录的所有子目录所扩展的那样。/src/

但是,这些子目录看起来与我习惯的其他包不同。例如, src/coopr.pyomo 仅包含一个 setup.py,而__init__.py位于CH/src/coopr.pyomo/coopr/pyomo中。虽然 IPython 似乎能够找到这些包,但 IPython 笔记本——尽管搜索路径相同——似乎对包的组织方式感到困惑。

4

2 回答 2

1

我不得不猜测,但是:

在笔记本中尝试类似以下的操作:

import coopr
print coopr.__file__

看起来您正在选择coopr与已安装模块不同的模块,并且该__file__属性应该告诉您您正在使用哪个模块。也许有一个脚本叫做coopr; 这样的脚本不会包含子模块pyomo

为什么这只会发生在 IPython notebook 而不会发生在 IPython 控制台中?我的猜测是,如果确实有一个不同的coopr模块,它位于您的主目录或 IPython 笔记本用作其“基础”的系统上的其他位置。IPython 控制台基目录是您启动它的位置,但 IPython 笔记本可能已解耦并具有默认基目录。我不知道笔记本是如何在 Windows 下运行的,所以我无法告诉你默认值是什么以及在哪里查看,但上面的代码可以很好地向你展示这一点。

于 2013-07-15T14:03:37.743 回答
0

感谢@Evert 为我指明了正确的方向。该问题是由我(粗心)将 Coopr 安装到site-packages我的 Python 安装目录中引起的。自我注意:不要那样做。虽然 IPython 自己设法找到了包,但 IPython 笔记本的搜索路径变得混乱,并将该coopr目录视为任何其他包文件夹。

将 Coopr 重新安装到我的 Python 安装目录之外的建议位置后,从中删除 coopr 目录site-packages,然后重新启动,一切正常。

于 2013-07-16T13:30:26.407 回答