在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运行它时,我都会得到一个输出文件,然后再解析这个文件来获取结果。
如果我能保持这个“执行”可执行文件一直打开,然后仍然用python exec.py variables.in.1 results.out.1的方式,脚本会解析输入文件,然后把它发送给已经打开的可执行文件,这样就能生成输出,那我的工作会快很多,也更有效率。
3 个回答
你需要用到的是“subprocess”模块,它可以让你轻松地启动进程,并连接它们的输入和输出。
为了避免程序卡住,你可以把输入和输出放在不同的进程里。你可以用“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
有没有办法让 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) 创建一个后台进程,让它一直在运行。
2) 把你想要监控的文件或文件夹的列表作为参数传给它。
3) 使用 inotify 来检测新文件的到来。
http://pyinotify.sourceforge.net/
4) 每当 inotify 发出信号时,就在你的后台进程里触发转换,调用相应的方法。
如果语法里有“python”命令,你就不能保持语法不变,因为这样每次都会重新启动解释器。