获取使用管道的系统命令的输出 (Python)
我正在尝试使用以下命令生成随机字符串:
strings /dev/urandom | grep -o '[[:alnum:]]' | grep -o '[[:alnum:]]' |头-n 30 | tr -d '\n';
工作正常,但是当我尝试执行 subprocess.call(cmd,shell=True)
时,它只是卡在字符串 /dev/urandom 命令上并用 grep:writingoutput:Brokenpipe
向我的屏幕发送垃圾邮件
是什么原因导致此问题以及如何修复它?
I'm trying to generate a random string using this command:
strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 30 | tr -d '\n';
Works fine, but when I try to do subprocess.call(cmd,shell=True)
it just gets stuck on the strings /dev/urandom command and spams my screen with grep: writing output: Broken pipe
What's causing this and how do I fix it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不需要子进程,观察:
此外,从
/dev/urandom
中string
ing 然后grep
ing 字母数字字符是巨大的 em> 效率低下并且浪费了大量的随机性。在我的台式电脑上,上面的 python 从 bash 执行需要不到 10 毫秒,你的strings ...
oneliner 需要 300-400...对于一个纯 python 解决方案,也可以在没有 < code>/dev/urandom - 并且只给出字母数字字符(如果你真的不需要 + 或 /):
No need for subprocess, observe:
Also,
strings
ing and thengrep
ing alphanumeric characters from/dev/urandom
is hugely inefficient and wastes a whole lot of randomness. On my desktop PC, the above python takes less than 10 ms to executed from bash, yourstrings ...
oneliner takes 300-400...For a pure python solution that works also on systems without
/dev/urandom
- and gives only alphanumeric characters (if you really don't want + or /):首先,对于你正在做的事情,最好直接使用 python 生成字符串。
无论如何,当使用
subprocess
时,将数据从一个进程传输到另一个进程的正确方法是将stdout
和/或stderr
重定向到>subprocess.PIPE
,并将前一个进程的stdout
提供给新进程的stdin
。First of all, for what you're doing, it should be better to generate the string using python directly.
Anyway, when using
subprocess
, the correct way to pipe data from a process to another is by redirectingstdout
and/orstderr
to asubprocess.PIPE
, and feed the new process'stdin
with the previous process'stdout
.