OpenManus中使用命令行运行py脚本报错
问题:
为什么单独运行执行graphrag脚本就没有问题,但是放到这里面就报错Fatal Python error: init_sys_streams: can't initialize sys standard streams
Python runtime state: core initialized。
并且还会导致openmanus运行卡住(打断后发现运行报错)。
问题分析:
出现这种情况的常见原因如下:
- 环境变量或标准流被修改
在你的主程序(或框架)中,可能有地方修改了标准输入输出(如重定向、关闭、替换 sys.stdin/out/err),导致子进程初始化标准流失败。 - 异步/多线程环境影响
如果你的主程序用的是异步(asyncio)或多线程,某些库(如 logging、IO 重定向等)可能会影响子进程的标准流初始化。 - 子进程继承了异常的文件描述符
主进程如果关闭了标准输入输出,子进程会继承,导致 Python 初始化 sys stream 失败。 - IDE/调试器影响
某些 IDE(如 VSCode、Jupyter、PyCharm)会重定向标准流,导致子进程环境异常。 - subprocess.run 的参数问题
如果传递了 stdin/stdout/stderr=None 或者主进程标准流已关闭,也会导致此错误。
建议:
- 确保主进程没有关闭或重定向 sys.stdin、sys.stdout、sys.stderr。
- 在 subprocess.run 里显式加上 stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE 试试。
- 尝试在命令行(非 IDE)下运行主程序,看是否还报错。
问题回答:遇到的 Fatal Python error: init_sys_streams: can't initialize sys standard streams 问题,在 openmanus 这类异步/多进程/重定向标准流的框架下,本质原因是子进程继承了被主进程重定向或关闭的标准输入输出,而 Python 子进程启动时无法初始化 sys.stdin/out/err。
解决方法:
将下面这个
subprocess.run(command, shell=True, check=True)
替换为:
result = subprocess.run(
command,
shell=True,
stdin=subprocess.DEVNULL,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
encoding="utf-8",
check=False,
)
在 subprocess.run 里显式加上添加了stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.PIPE这几个参数,就可以避免openmanus 这类异步/多进程/重定向标准流的框架下的子进程继承了被主进程重定向或关闭的标准输入输出的问题。