获取使用管道的系统命令的输出(Python)

时间:2011-08-17 05:01:32

标签: python linux pipe

我正在尝试使用此命令生成随机字符串:

strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 30 | tr -d '\n';

工作正常,但当我尝试subprocess.call(cmd,shell=True)时,它只会卡在字符串/ dev / urandom命令上,并使用grep: writing output: Broken pipe

命中我的屏幕

造成这种情况的原因是什么?如何解决?

2 个答案:

答案 0 :(得分:5)

不需要子进程,请观察:

>>> import base64
>>> r = open("/dev/urandom","r")
>>> base64.encodestring(r.read(22))[:30]
'3Ttlx6TT3siM8h+zKm+Q6lH1k+dTcg'
>>> r.close()

此外,来自strings的{​​{1}}然后grep字母数字字符非常效率低下并浪费了大量随机性。在我的桌面PC上,上面的python从bash执行的时间不到10毫秒,你的/dev/urandom oneliner需要300-400 ...

对于纯python解决方案,它也适用于没有strings ...的系统 - 并且只提供字母数字字符(如果你真的不想要+或/):

/dev/urandom

答案 1 :(得分:0)

首先,对于你正在做的事情,最好直接使用python生成字符串。

无论如何,在使用subprocess时,将数据从流程管道传输到另一个流程的正确方法是将stdout和/或stderr重定向到subprocess.PIPE,然后输入新流程“stdin与之前的流程”stdout