在Python中与unix筛选器进程通信

在Python中与unix筛选器进程通信,python,django,ipc,subprocess,Python,Django,Ipc,Subprocess,我正在编写一个Python程序,它需要使用一个外部unix程序作为过滤器来清理许多小字符串。目前,我为要清理的每个字符串创建一个新的子流程: import subprocess def cleanstring(s): proc = subprocess.Popen(['/bin/filter','-n'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE )

我正在编写一个Python程序,它需要使用一个外部unix程序作为过滤器来清理许多小字符串。目前,我为要清理的每个字符串创建一个新的子流程:

import subprocess
def cleanstring(s):
    proc = subprocess.Popen(['/bin/filter','-n'],
        stdin=subprocess.PIPE, stdout=subprocess.PIPE,
        stderr=subprocess.PIPE
    )
    out, err = proc.communicate(s)
    assert not err
    return out
显然,这种方法效率极低。启动过滤器子流程并通过stdin/stdout与之通信的有效方法是什么

我一直在研究如何使用来实现这一点,但这可能是一种过分的做法。代码将从非线程web服务器上的Django视图中调用,因此它将只由一个线程多次调用


谢谢

我认为您当前的代码是最好的解决方案。在Linux下,启动一个进程并没有那么昂贵,您已经巧妙地封装了这个问题。您直接启动
过滤器
程序,因此您没有启动shell来运行它的开销

另外,我相当担心缓存。假设您确实让
过滤器
程序在后台运行,读取和写入命名管道或其他内容。你如何确保每一根你推过的绳子都能马上出来?如何刷新管道以使输出与输入同步


您是否测量了Django服务器上的负载并发现这是一个问题?如果您已经衡量了绩效,请分享这些数字。如果你真的有问题,我会感到惊讶。

如果你没有测量它,那么它就不是性能问题,更不用说“非常低效”

也就是说,您可以像这样与子流程通信:

import subprocess
import sys

p = subprocess.Popen('bc', shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

 for i in range(10):
     p.stdin.write('%s*2\n' % (i,))
     res = p.stdout.readline()
     if res:
         print "vtrip says %s*2 is %s" % (i, res.strip())
         p.stdin.flush()
这将打印由同一bc进程返回的0-9的双精度。应该很容易适应detex(最主要的是正确处理冲洗,这样一端就不会卡在等待另一端)

这就是沟通的部分。至于“在Django内部长期运行”可能不是一个好主意。排队可能确实太多了

像Celery等人这样的任务队列用于独立处理任务,而不是用于处理每个任务的同一个长时间运行的服务


也许运行一些小型python守护进程,保持过滤器进程打开,并处理来自Django的请求?我们说的是重负载,还是内部的,比如说,每天100个用户?除了一些粗略的锁定之外,您可能根本不需要太多的同步。

外部程序做什么?用Python做同样的事情容易吗?不,不是。我想调用的过滤器是detex,它从文本中删除TeX和LaTeX标记。在Python中正确实现这一点需要为TeX/LaTeX.OK编写/测试/维护一个lex解析器。小字符串是否包含换行符?你能给子进程提供一个批处理,得到结果,并在换行符上拆分吗?批处理会使实际程序的结构复杂化。我希望detex在需要时进行处理。它已经可以与我描述的实现配合使用了。我只是想让它更有效率。我担心的是如何刷新缓冲以确保字符串得到处理。您的代码表明这实际上非常简单:
p.stdin.flush()
So+1。