我不明白为什么IPython的不分配一些系统命令蟒蛇变量的结果。 这似乎不断地发生在我身上的ack
和ag
的可执行文件
例如,下面的命令产生输出:
In [1]: !ack --nocolor foo
bar
1:foo
但是,每当我该结果保存到变量中,我得到一个空输出
In [2]: out=!ack --nocolor foo
In [3]: out
Out[3]: []
甚至当我尝试了各种黑客攻击,我得到这个问题:
In [4]: out=!ack --nocolor foo > tmp; sleep 1; cat tmp
In [5]: out
Out[5]: []
事实上, tmp
是后一种情况,这表明输出捕获这些命令的食堂了空。
有谁如何,如果这是与IPython中或ACK / AG的一个问题,或者只是我的IPython中应该如何表现这里的误解?
我推断out = !cmd
使用%sx
。 这是多么不同的!cmd
运行(见文档%sw
和%system
)。
%sx
经过的功能的若干层,并且结束调用
# import IPython
IPython.utils._process_common.process_handler
它的代码是类似于subprocess
是@Elliott弗里施用在他删除应答呼叫:
p = subprocess.Popen("ack --nocolor foo", stdout=subprocess.PIPE, shell=True)
(output, err) = p.communicate()
我抽象出process_handler
代码:
def cmd1(astr='ack --nocolor 15 *.txt'):
callback = lambda p: p.communicate()
stderr = subprocess.PIPE
stderr = subprocess.STDOUT
shell = True
close_fds = True
executable = None
p = subprocess.Popen(astr,
shell=shell,
executable=executable,
#stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=stderr,
close_fds=close_fds,
)
out = callback(p)
return out, p.returncode
这工作:
In [40]: cmd1()
Out[40]:
((b'stack53269737.txt:2:11 12 13 14 15 16\ntest.txt:3:11\t12 13 14 15\ntest1.txt:5: 0.054181, 0.506962, 0.315159, 0.653104\n',
None),
0)
但是,如果我去掉了stdin
线,它失败:
In [42]: cmd1()
Out[42]: ((b'', None), 1)
因此,它的
stdin=subprocess.PIPE,
参数引起ack
调用失败。 它不会导致像其他常见的shell命令的问题ls
或grep
。
ack
帮助有:
--[no]filter Force ack to treat standard input as a pipe
(--filter) or tty (--nofilter)
添加--nofilter
我的命令( --nocolor
不需要用这种重定向):
In [50]: cmd1('ack --nofilter 15 *.txt')
Out[50]:
((b'stack53269737.txt:2:11 12 13 14 15 16\ntest.txt:3:11\t12 13 14 15\ntest1.txt:5: 0.054181, 0.506962, 0.315159, 0.653104\n',
None),
0)
In [51]: out = !ack --nofilter 15 *.txt
In [52]: out
Out[52]:
['stack53269737.txt:2:11 12 13 14 15 16',
'test1.txt:5: 0.054181, 0.506962, 0.315159, 0.653104',
'test.txt:3:11\t12 13 14 15']
所以这是关键的-力ack
忽略管道输入(虽然我不完全了解细节)。