【问题标题】:Run IPython in a script在脚本中运行 IPython
【发布时间】:2016-03-04 00:21:41
【问题描述】:

我正在尝试使用 IPython 编写一些脚本,但我发现它在脚本中的行为与我运行交互式 shell 时的行为非常不同。

例如,我可以交互地运行以下命令:

In [1]: %profile
default

In [2]: ls /
bin/   cdrom/  etc/   initrd.img@      lib/    lib64/       media/  opt/   root/  sbin/  sys/  usr/  vmlinuz@
boot/  dev/    home/  initrd.img.old@  lib32/  lost+found/  mnt/    proc/  run/   srv/   tmp/  var/  vmlinuz.old@

In [3]: mkdir tmpdir

In [4]: cd tmpdir
/home/alex/tmp/tmpdir

没问题。

但是,当我在脚本中运行这些命令时,它们都不起作用:

#!/usr/bin/ipython3

%profile
ls /
mkdir tmpdir
cd tmdir

我收到一个错误:

$ ./tmp.py 
  File "/home/alex/tmp/tmp.ipython", line 3
    %profile
    ^
SyntaxError: invalid syntax

我已尝试通过以下方式运行它:

  1. 如上直接调用文件,
  2. 使用 ipython 显式调用它:`ipython3 tmp.py'
  3. 在使用 ipython 调用时将 -i--profile=sh 参数传递给 ipython
  4. 将文件扩展名更改为.ipython.ipy

我的问题: 为什么它在脚本中的行为与 shell 不同?如何让 IPython 在脚本中运行这些命令?

【问题讨论】:

    标签: python shell ipython


    【解决方案1】:

    由于IPython magic,它们正在工作,但它们是 shell 命令,在 Python 中不起作用。要让他们考虑subprocess library。在 shell 命令中有空格的地方,列表中有逗号分隔的值。

    import subprocess
    subprocess.check_call(['ls'])
    subprocess.check_call(['ls', '-a'])
    

    【讨论】:

    • 我希望获得 IPython 魔法的优势,但是以脚本形式......有什么理由认为这种东西应该在 shell 而不是脚本中可用?跨度>
    • 我没有这方面的经验,但你试过importing IPython吗?我的理解是这些函数是 IPython 的一部分,所以如果你不在那个环境中,那么你就无法访问它们。
    • 刚刚试过了,没有效果。我假设因为我选择 IPython 作为解释器,所以无论如何它都会这样做......
    • 我从来没有见过你描述的方式。那将会很酷。但也许它们不再被称为“魔法”了!
    • 我不确定我是否理解其中的区别......手动在 IPython shell 中键入行和 IPython 从文件中读取相同的行有什么区别?
    猜你喜欢
    • 2012-07-29
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多