【问题标题】:Import functions that use ipython magic导入使用 ipython 魔法的函数
【发布时间】:2020-09-09 02:10:05
【问题描述】:

在 ipython 单元格中,您可以执行以下 shell 命令:

ipython:

print("asdf")
!echo asdf

但是,如果您尝试从文件中导入此代码,

asdf.py:

def asdf():
  print("asdf")
  !echo asdf

ipython:

from asdf import asdf

它会导致错误。

!echo asdf
^
SyntaxError: invalid syntax

其用例是在 google colab 中使用 ffmpeg、wget、mount 等重复的大量脚本
虽然您可以使用 os.system 或子进程,但它们在提供实时标准输出方面没有那么互动。

【问题讨论】:

  • 这是一个 ipython 功能。一般情况下,您不能在 Python 中使用 ! 语法。
  • 你的问题究竟是什么?
  • Imo 这可能是不可能的,因为 Ipython 魔术只发生在交互式 shell 中,在输入传递给 python 解释器之前。这不是 import 语句的情况。
  • @mkrieger1,我想知道如何重用(例如通过导入)使用 ipython 魔法的代码。我更喜欢使用它,因为执行 shell 命令的 os.system 和 subprocess 方法不提供交互式/实时输出。

标签: python shell ipython python-import ipython-magic


【解决方案1】:

用例解决方案

如果您想重用其中包含 ipython 魔术函数的代码,只需使用 %run 而不是 import

ipython:

%run utils.ipynb

utils.ipynb:

def asdf():
  print("asdf")
  !echo asdf

上面的例子可以正常工作。
取自this answer


关于重用 ipython 代码

为什么最初的问题是某种A-B 问题?原因是您不应该真正将 ipython 附加功能拖到纯 python 执行中。

  • 如果您有一个带有实用工具的 google colab 笔记本, 然后只需从公共链接!wget%run 它。
  • 如果您要执行 python 脚本,请在 .py 文件上执行常规 import

当然,有一些方法可以将 .ipynb 文件导入 python 代码:Jupyter notebook 的 Notebook Loaderipynb packagenbimporter package(但即使是 nbimporter 的作者也说 你不应该真的这样做. 只需使用 VSCode 或其他工具将您的笔记本转换为.py)。

所以,如果您使用 ipython 研究环境和功能,坚持下去。或者切换到具有适当模块、测试等的纯 python 环境。


另外,如果你正在为 wget 做努力:

file_id = "1xE8Db1zvQ7v-z13CO2qc3F6wJmtr3YHu" # can be extracted from public link
file_out_name = "utils.ipynb"
!wget "https://docs.google.com/uc?export=download&id=""$file_id" -O "$file_out_name"

但是,在调用cmd的问题上,我看不到在python中用一行代码交互地执行shell命令subprocess 可以做到这一点,it takes multiple lines to achieve

【讨论】:

    猜你喜欢
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    相关资源
    最近更新 更多