我正在使用以下bash命令模式运行memcached:
memcached -vv 2>&1 | tee memkeywatch2010098.log 2>&1 | ~/bin/memtracer.py | tee memkeywatchCounts20100908.log
Run Code Online (Sandbox Code Playgroud)
尝试跟踪无与伦比的获取到平台键的集合.
memtracer脚本位于下方并按预期工作,只有一个小问题.看到中间日志文件大小,memtracer.py在memkeywatchYMD.log大小约为15-18K之前不会开始输入.有没有更好的方法来读取stdin或者可能是将缓冲区大小降低到1k以下以获得更快的响应时间?
#!/usr/bin/python
import sys
from collections import defaultdict
if __name__ == "__main__":
keys = defaultdict(int)
GET = 1
SET = 2
CLIENT = 1
SERVER = 2
#if <
for line in sys.stdin:
key = None
components = line.strip().split(" ")
#newConn = components[0][1:3]
direction = CLIENT if components[0].startswith("<") else SERVER
#if lastConn != newConn:
# lastConn = newConn
if direction == CLIENT:
command = SET if …Run Code Online (Sandbox Code Playgroud) 我正在寻找STDIN从外部进程向现有进程写入数据的方法,并发现了类似的问题 如何将数据从Python中的不同本地/远程进程流式传输到程序的STDIN中?在stackoverlow中.
在那个帖子中,@ Michael说我们可以在下面的路径中获取现有进程的文件描述符,并允许在Linux上将数据写入其中.
/proc/$PID/fd/
Run Code Online (Sandbox Code Playgroud)
所以,我创建了一个下面列出的简单脚本来测试从外部进程向脚本STDIN(和TTY)写入数据.
#!/usr/bin/env python
import os, sys
def get_ttyname():
for f in sys.stdin, sys.stdout, sys.stderr:
if f.isatty():
return os.ttyname(f.fileno())
return None
if __name__ == "__main__":
print("Try commands below")
print("$ echo 'foobar' > {0}".format(get_ttyname()))
print("$ echo 'foobar' > /proc/{0}/fd/0".format(os.getpid()))
print("read :: [" + sys.stdin.readline() + "]")
Run Code Online (Sandbox Code Playgroud)
这个测试脚本显示的路径STDIN和TTY,然后,等待一个写它STDIN.
我启动了这个脚本并在下面收到了消息.
Try commands below
$ echo 'foobar' > /dev/pts/6
$ echo 'foobar' > /proc/3308/fd/0
Run Code Online (Sandbox Code Playgroud)
所以,我执行的命令echo 'foobar' …
我正在尝试从正在管道输入的文件内容创建一个zip文件,例如
mysql [params and query] | zip -q output.zip -
Run Code Online (Sandbox Code Playgroud)
这会正确写入zip,但是当您打开zip时,其中的文件称为" - ".有没有办法指定数据中管道的文件名应该在zip中?
如何使用python子进程模块复制以下批处理命令?
myprogram < myinput.in > myoutput.out
Run Code Online (Sandbox Code Playgroud)
换句话说,如何myprogram使用myinput.in标准输入和myoutput.out标准输出的内容运行?
我写了很多小脚本,逐行处理文件.在Perl中,我使用
while (<>) {
do stuff;
}
Run Code Online (Sandbox Code Playgroud)
这很方便,因为它不关心输入来自何处(文件或标准输入).
在Python中我使用它
if len(sys.argv) == 2: # there's a command line argument
sys.stdin = file(sys.argv[1])
for line in sys.stdin.readlines():
do stuff
Run Code Online (Sandbox Code Playgroud)
这似乎不是很优雅.是否有一个容易处理文件/标准输入的Python习语?
在RingoJS中有一个叫做的函数read,它允许你读取整个流,直到到达终点.这在您创建命令行应用程序时很有用.例如,您可以编写如下tac 程序:
#!/usr/bin/env ringo
var string = system.stdin.read(); // read the entire input stream
var lines = string.split("\n"); // split the lines
lines.reverse(); // reverse the lines
var reversed = lines.join("\n"); // join the reversed lines
system.stdout.write(reversed); // write the reversed lines
Run Code Online (Sandbox Code Playgroud)
这允许您启动shell并运行tac命令.然后根据需要输入任意数量的行,完成后可以按Ctrl+ D(或Windows上的Ctrl+ Z)表示传输结束.
我想在node.js中做同样的事情,但我找不到任何会这样做的函数.我想用的readSync 功能,从fs图书馆到模拟如下,但无济于事:
fs.readSync(0, buffer, 0, buffer.length, null);
Run Code Online (Sandbox Code Playgroud)
在对标准输入文件描述符(第一个参数)是0.所以它应该从键盘读取数据.相反,它给了我以下错误:
Error: ESPIPE, invalid seek …Run Code Online (Sandbox Code Playgroud) 我想用stdin做一个简单的应用程序.我想在一个程序中创建一个列表并在另一个程序中打印它.我想出了下面的内容.
我不知道app2是否有效但是在app1中我得到了异常"StandardIn尚未被重定向".在writeline上(在foreach声明中).我该怎么办?
注意:我尝试将UseShellExecute设置为true和false.两者都会导致此异常.
//app1
{
var p = new Process();
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.FileName = @"path\bin\Debug\print_out_test.exe";
foreach(var v in lsStatic){
p.StandardInput.WriteLine(v);
}
p.StandardInput.Close();
}
//app 2
static void Main(string[] args)
{
var r = new StreamReader(Console.OpenStandardInput());
var sz = r.ReadToEnd();
Console.WriteLine(sz);
}
Run Code Online (Sandbox Code Playgroud) 在一个旨在从shell运行的简单Python脚本中,我是否可以可靠地确定sys.stdin是否已从实际文件重定向而不是从另一个进程传输?
我想根据stdin是来自数据文件还是来自另一个进程通过管道流来改变运行时行为.
正如预期的那样,isatty()在两种情况下都返回False.这是一个快速isatty()测试:
# test.py
import os
import sys
print sys.stdin.isatty()
print os.isatty(sys.stdin.fileno())
Run Code Online (Sandbox Code Playgroud)
测试:
python test.py < file.txt
Run Code Online (Sandbox Code Playgroud)
生产:
False
False
Run Code Online (Sandbox Code Playgroud)
和:
ls -al | python test.py
Run Code Online (Sandbox Code Playgroud)
生产:
False
False
Run Code Online (Sandbox Code Playgroud)
有这样做的pythonic方法吗?
Unix/Linux特定的很好,但知道是否可以以可移植的方式执行此操作会很好.
编辑:请注意评论者:我为什么关心?好吧,在我的情况下,我想处理从另一个进程传输时不规则间隔的时间戳数据; 当我从文件中播放预先录制的数据时,我想使用固定或可变延迟重放它.
我同意使用更干净的方法可能是有利的(我可以想到几个,包括在回放流中插入延迟的中间脚本),但我最终很好奇.
我看到了很多其他语言但不是JavaScript.
我正在尝试这样的问题:这个(codechef.com),当然程序需要能够像C++和其他语言那样读取标准.
编辑:谢谢你的答案.我想要这个功能的主要原因是我可以回答CodeChef上的问题; Codechef将多个输入发送到作为答案的文件/程序(当然程序必须以所需的方式响应才能使答案正确).