无法从Python2.7虚拟环境运行IPython nbconvert

时间:2017-04-20 12:18:45

标签: python-2.7 virtualenv jupyter-notebook fabric nbconvert

我有一个 Python 2.7 的虚拟环境,安装了 ipython (Ubuntu 16.04.2(Xenial)LTS。)

当我在虚拟环境中工作时(在虚拟环境的父目录中运行 bash shell中的source venv/bin/activate之后)我执行jupiter的转换没有问题来自 bash shell的笔记本如下:

ipython nbconvert --to html --execute my_notes.ipynb --stdout > /tmp/report.html 

但是当我尝试使用subprocess

从Fabric的任务调用该命令时
command = ['ipython', 'nbconvert', '--to', 'html', '--execute', notebook_path, '--stdout']
output = subprocess.check_output(command,
                                 cwd=os.environ['PYTHONPATH'],
                                 env=os.environ.copy())

它始终失败,因为我无法找到原因:

Traceback (most recent call last):
  File "/opt/backend/venv/bin/ipython", line 7, in <module>
    from IPython import start_ipython
  File "/opt/backend/venv/local/lib/python2.7/site-packages/IPython/__init__.py", line 48, in <module>
    from .core.application import Application
  File "/opt/backend/venv/local/lib/python2.7/site-packages/IPython/core/application.py", line 25, in <module>
    from IPython.core import release, crashhandler
  File "/opt/backend/venv/local/lib/python2.7/site-packages/IPython/core/crashhandler.py", line 28, in <module>
    from IPython.core import ultratb
  File "/opt/backend/venv/local/lib/python2.7/site-packages/IPython/core/ultratb.py", line 119, in <module>
    from IPython.core import debugger
  File "/opt/backend/venv/local/lib/python2.7/site-packages/IPython/core/debugger.py", line 46, in <module>
    from pdb import Pdb as OldPdb
  File "/usr/lib/python2.7/pdb.py", line 59, in <module>
    class Pdb(bdb.Bdb, cmd.Cmd):
AttributeError: 'module' object has no attribute 'Cmd'

有关节省时间的更多信息。

我试过了:

  • 使用与来自PyCharm run / debug配置的 PYTHONPATH 相同的路径。
  • nbconvert 用作python库from this documentation
  • 尝试os.system("ipython nbconvert…")
  • 使用shell脚本包装工作命令(ipython nbconvert…)并在subprocess.check_outputos.system中使用它。
  • 喝醉了,把头撞在砖墙上。

总是最终被那个被诅咒的例外所困扰。

1 个答案:

答案 0 :(得分:0)

重新作为完整性的答案:

在某个地方有一个名为cmd.py的文件,其中Python将其视为可导入模块。这隐藏了标准库中的cmd module,它由IPDthon导入的pdb使用。当pdb试图从cmd继承一个类时,那个类就不存在了。移动cmd.py可以让它找到所需的cmd模块。

这对Python来说是一个令人遗憾的烦恼 - 许多短字已经被用作模块名称,并且自己使用它们会产生崩溃,并且会出现各种各样的错误。