保持流程开放并在Python中与之通信

时间:2011-06-09 16:58:11

标签: python

我正在使用python脚本进行一些迭代。我做的是这样的事情。

python exec.py variables.in.1 output.out.1

这里1是迭代次数。

现在它的作用是,它使用变量文件中的值调用可执行文件,然后将可执行文件的输出放入输出文件中。不幸的是,我看到通过一次又一次地调用可执行文件需要更多时间。

我要做的就是启动可执行文件一次,然后使用相同的语法将变量发送到可执行文件,即python exec.py variables.in.1 output.out.1。

我需要保留这种语法是因为变量文件是在外部生成的。我无法控制它,但是一旦生成它我需要使用可执行文件来创建输出文件,然后需要以所需的格式进行解析。

编辑:我会尝试以简化的方式表示我正在做的事情,因为它是一个很大的代码。

import sys
import os
import parseinput
import parseoutput

s1=sys.argv[1];s2=sys.argv[2]

op=open(s1,'r');inp=op.readlines();op.close()
variableswrite=parseinput.parseinput(inp)
op=open('pass.dat','w');op.write(variableswrite);op.close()

os.sytem('execute < pass.dat')

op=open('executeout.dat','r');out=op.readlines();op.close()
outwrite=parseoutput.parseoutput(out)
op=open(s2,'w');op.write(outwrite);op.close()

这是展示我在做什么的一种非常粗糙的方式。如果这是代码exec.py,每次我使用python exec.py variables.in.1 results.out.1运行它时,我将使用可执行文件获取输出文件,该文件将被解析以获取输出文件。

相反,如果我可以保持'execute'可执行文件打开,仍然执行python exec.py variables.in.1 results.out.1,其中脚本将解析输入文件,然后将其发送到打开的可执行文件,然后会创建输出,我的工作将更加快速和有效。

3 个答案:

答案 0 :(得分:0)

有没有办法可以增加exec.py以获取任意数量的输入/输出文件名对?

如果是这样,调用将如下所示:

python exec.py variables.in.1 output.out.1 ... variables.in.N output.out.N

现在,假设你有1000对这样的对。您可以将此范围划分为20组,每组50对(例如)。并使用不同的组调用脚本20次(同时):

python exec.py variables.in.1 output.out.1 ... variables.in.50 output.out.50
python exec.py variables.in.51 output.out.51 ... variables.in.100 output.out.100
...
python exec.py variables.in.951 output.out.951 ... variables.in.1000 output.out.1000

答案 1 :(得分:0)

你想要的是

1)创建一直运行的守护程序进程

2)将受监控文件或文件夹列表作为参数

3)使用inotify检测新的传入文件

http://pyinotify.sourceforge.net/

4)每次inotify发出一个信号,通过调用方法触发守护进程内的转换

如果语法具有“python”命令,则无法保持语法相同,因为这样每次都会重新启动解释器。

答案 2 :(得分:0)

您需要的是“子流程”模块,它可以简化启动流程并连接其输入和输出管道

为避免阻塞,只需在单独的进程中执行输入和输出。你可以用“os.fork”来做到这一点:

import os
import subprocess
execute = subprocess.Popen(
    'execute',
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE
)
if os.fork():
    #feed data into the input
    while True:
        input = ...
        execute.stdin.write(input)
else:
    outGenerator=Out
    #do something with the output
    for outline in execute.stdout:
        print outline

或者您可以将输入和输出代码分成两个文件,然后使用类似“”的内容:

import os
import subprocess
generateInput = subprocess.Popen(
    ['python','generateInput.py'],
    stdout=subprocess.PIPE
)
execute = subprocess.Popen(
    'execute',
    stdin=generateInput.stdout,
    stdout=subprocess.PIPE
)
generateOutput = subprocess.Popen(
    ['python','generateOutput.py'],
    stdin=execute.stdout
)
execute.communicate()

这只是很长的说法

python generateInput.py | execute | python gnerateOutput.py