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

2 投票
3 回答
711 浏览
提问于 2025-04-16 19:16

我正在用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 个回答

0

你需要用到的是“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

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
0

你想要做的是:

1) 创建一个后台进程,让它一直在运行。

2) 把你想要监控的文件或文件夹的列表作为参数传给它。

3) 使用 inotify 来检测新文件的到来。

http://pyinotify.sourceforge.net/

4) 每当 inotify 发出信号时,就在你的后台进程里触发转换,调用相应的方法。

如果语法里有“python”命令,你就不能保持语法不变,因为这样每次都会重新启动解释器。

撰写回答