如何向后台运行的Hython进程发送命令行并清理缓存?
后台Hython进程通信与内存缓存清理方案
一、向运行中的无界面Hython进程发送命令
针对已启动的无界面Hython进程,可通过以下方式实现指令通信:
- 命名管道(Windows环境):启动Hython时注入管道监听逻辑,后续通过管道发送指令。
启动命令示例:
服务器端发送命令的Python代码:hython -c "import win32pipe, win32file, traceback; pipe = win32pipe.CreateNamedPipe(r'\\.\pipe\hython_pipe_1', win32pipe.PIPE_ACCESS_DUPLEX, win32pipe.PIPE_TYPE_MESSAGE | win32pipe.PIPE_WAIT, 1, 65536, 65536, 0, None); win32pipe.ConnectNamedPipe(pipe, None); while True: try: cmd = win32file.ReadFile(pipe, 4096)[1].decode(); exec(cmd); win32file.WriteFile(pipe, b'OK') except: err = traceback.format_exc().encode(); win32file.WriteFile(pipe, err)"
注意每个Hython进程要绑定唯一的管道名称,避免冲突。import win32pipe, win32file pipe = win32file.CreateFile(r'\\.\pipe\hython_pipe_1', win32file.GENERIC_READ | win32file.GENERIC_WRITE, 0, None, win32file.OPEN_EXISTING, 0, None) win32file.WriteFile(pipe, b'import hou; print(hou.version())') resp = win32file.ReadFile(pipe, 4096)[1].decode() print(resp) - 预启动时重定向标准流:如果是服务器调度启动Hython,启动时用
subprocess.Popen将stdin/stdout重定向到管道,后续直接通过管道写入命令。示例:import subprocess proc = subprocess.Popen(['hython'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) # 发送命令 proc.stdin.write('import hou; print(hou.hipFile.path())\n') proc.stdin.flush() # 读取输出 output = proc.stdout.readline() print(output)
二、解决Hython进程内存占用过高问题
既然官方API无缓存刷新功能,试试以下底层操作:
- 执行Hscript缓存清理命令:在Hython中调用
hou.hscript("opclearall"),这个命令会清除所有节点的计算缓存,比单个节点的Unload标签更彻底。 - 强制Python垃圾回收+清理会话变量:
import gc # 清理hou.session中的自定义变量 for key in list(hou.session.__dict__.keys()): if not key.startswith('_'): del hou.session.__dict__[key] # 强制垃圾回收 gc.collect() - 清除Undo历史:执行
hou.hipFile.clearUndo(),减少历史操作占用的内存。 - 任务完成后重启进程:如果以上方法都无法释放内存,最直接的方式是在每个任务结束后让Hython进程自行退出,服务器再启动新的进程。虽然增加了启动开销,但能彻底解决内存泄漏问题。
内容的提问来源于stack exchange,提问作者gargam
相关产品推荐
相关产品推荐

