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

发布于 2024-11-29 23:51:55 字数 305 浏览 1 评论 0原文

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

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

鯉魚旗 2024-12-06 23:51:55

不需要子进程,观察:

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

此外,从 /dev/urandomstringing 然后 greping 字母数字字符是巨大的 em> 效率低下并且浪费了大量的随机性。在我的台式电脑上,上面的 python 从 bash 执行需要不到 10 毫秒,你的 strings ... oneliner 需要 300-400...

对于一个纯 python 解决方案,也可以在没有 < code>/dev/urandom - 并且只给出字母数字字符(如果你真的不需要 + 或 /):

import string
import random
''.join([random.choice(string.printable[:62]) for i in range(30)])

No need for subprocess, observe:

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

Also, stringsing and then greping 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, your strings ... 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 /):

import string
import random
''.join([random.choice(string.printable[:62]) for i in range(30)])
霞映澄塘 2024-12-06 23:51:55

首先,对于你正在做的事情,最好直接使用 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 redirecting stdout and/or stderr to a subprocess.PIPE, and feed the new process' stdin with the previous process' stdout.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文