性能替换IPython!shell命令魔术

时间:2018-12-14 08:59:21

标签: python jupyter-notebook ipython google-colaboratory

在Google Colab上,使用:

! shell-command

非常糟糕。

这是一个测试:

import os
%timeit os.system('date > /dev/null')
%timeit ! date > /dev/null

给出输出:

100 loops, best of 3: 8.58 ms per loop
1 loop, best of 3: 1.56 s per loop

这使得! command的使用速度比使用system()的简单命令要慢180倍。

如何在仍然将stdout / stderr实时写入输出单元的同时避免使用! command

尤其是,我希望能够在单个屏幕行上显示诸如wget的动态进度条之类的内容,但是我会选择一个解决方案,为每个进度条写一个新行更新。

2 个答案:

答案 0 :(得分:0)

您可以尝试("Extent1"."SOME_STRING_COLUMN" IS NOT NULL) 。它的工作方式类似于subprocess.check_output,但是您需要先将命令拆分为数组。

答案 1 :(得分:0)

Python Run External Command And Get Output On Screen or In Variable给出:

import subprocess, sys

## command to run - tcp only ##
cmd = "/usr/sbin/netstat -p tcp -f inet"

## run it ##
p = subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE)

## But do not wait till netstat finish, start displaying output immediately ##
while True:
    out = p.stderr.read(1)
    if out == '' and p.poll() != None:
        break
    if out != '':
        sys.stdout.write(out)
        sys.stdout.flush()

请注意,这不会捕获或打印STDERR。编辑欢迎。