我正在尝试使用此命令生成随机字符串:
strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 30 | tr -d '\n';
工作正常,但是当我尝试这样做时subprocess.call(cmd,shell=True),只会卡在字符串/ dev/urandom命令上并使用grep: writing output: Broken pipe
造成这种情况的原因是什么?如何解决?
不需要子进程,观察:
>>> import base64
>>> r = open("/dev/urandom","r")
>>> base64.encodestring(r.read(22))[:30]
'3Ttlx6TT3siM8h+zKm+Q6lH1k+dTcg'
>>> r.close()
Run Code Online (Sandbox Code Playgroud)
此外,strings荷兰国际集团,然后grep从荷兰国际集团的字母数字字符/dev/urandom是巨大的低效和浪费一大堆的随机性.在我的桌面PC上,上面的python从bash执行不到10毫秒,你的strings ...oneliner需要300-400 ...
对于纯python解决方案,它也适用于没有的系统/dev/urandom- 并且只提供字母数字字符(如果你真的不想要+或/):
import string
import random
''.join([random.choice(string.printable[:62]) for i in range(30)])
Run Code Online (Sandbox Code Playgroud)