我正在尝试使用此命令生成随机字符串:
strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 30 | tr -d '\n';
工作正常,但当我尝试subprocess.call(cmd,shell=True)
时,它只会卡在字符串/ dev / urandom命令上,并使用grep: writing output: Broken pipe
造成这种情况的原因是什么?如何解决?
答案 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
。