Python脚本执行二进制文件时子进程失败,报std::basic_string构造异常
排查与解决子进程执行失败问题
看起来你遇到的这个C++字符串构造报错(std::basic_string<char...>::basic_string),大概率是你的二进制文件my_binary在启动时遇到了参数、环境变量或者权限相关的问题,导致它内部的字符串初始化失败。我来帮你一步步排查和解决:
一、先补全代码的明显遗漏
你的代码里out, err=...没有完成,必须调用p1.communicate()来读取子进程的输出,否则子进程可能因为管道阻塞而崩溃,这可能是问题的诱因之一。
二、基础验证步骤
- 手动执行二进制:直接在终端运行
/var/home/root/my_binary exec,看是否会出现同样的报错。如果会,说明问题出在二进制本身、参数或者系统环境,和Python调用无关;如果手动执行正常,再聚焦到Python代码的问题。 - 检查文件权限与存在性:确认
/var/home/root/my_binary确实存在,并且当前用户有执行权限。可以在终端用ls -l /var/home/root/my_binary查看,也可以在Python里加验证逻辑。
三、环境变量问题排查
你直接修改了os.environ的USER变量,这可能覆盖了系统原有的USER环境变量,而my_binary可能依赖这个变量做路径解析、权限校验等操作。建议不要直接修改系统环境变量,而是复制一份后再添加/修改自定义变量:
# 复制原有环境变量,避免丢失系统必要的变量 env = os.environ.copy() env["ABCDE"] = "x.x.x.x" # 建议把USER改成自定义变量名,比如APP_USER,避免覆盖系统变量 env["APP_USER"] = "user" env["PASSWORD"] = "password"
然后在Popen里传入env=env参数。
四、完善Python代码的错误处理
下面是补全后的代码,加入了错误捕获、超时、日志记录等逻辑,方便你定位问题:
import os import sys import logging from subprocess import Popen, PIPE logging.basicConfig( level=logging.DEBUG, format='%(asctime)s %(levelname)-8s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename='/var/home/root/root.txt', filemode='w' ) # 复制系统环境变量并添加自定义变量 env = os.environ.copy() env["ABCDE"] = "x.x.x.x" env["APP_USER"] = "user" # 替换原USER变量为自定义名称 env["PASSWORD"] = "password" binary_path = "/var/home/root/my_binary" # 先检查二进制文件状态 if not os.path.exists(binary_path): logging.error(f"错误:未找到二进制文件 {binary_path}") sys.exit(1) if not os.access(binary_path, os.X_OK): logging.error(f"错误:没有 {binary_path} 的执行权限") sys.exit(1) try: # 启动子进程,设置超时防止无限阻塞 p1 = Popen([binary_path, "exec"], stdout=PIPE, stderr=PIPE, env=env) out, err = p1.communicate(timeout=30) # 解码输出(处理可能的编码问题) stdout = out.decode('utf-8', errors='replace') stderr = err.decode('utf-8', errors='replace') if p1.returncode != 0: logging.error(f"子进程执行失败,返回码:{p1.returncode}") logging.error(f"子进程错误输出:{stderr}") logging.error(f"子进程标准输出:{stdout}") else: logging.info("子进程执行成功") logging.info(f"子进程输出:{stdout}") except TimeoutError: logging.error("子进程执行超时,已终止") p1.kill() except Exception as e: logging.error(f"执行过程中发生意外错误:{str(e)}")
五、其他可能的原因
- 参数错误:确认
exec是my_binary接受的合法参数,有没有参数顺序错误或者缺少必要参数?比如是否应该是my_binary --exec或者其他格式? - 依赖库缺失:用
ldd /var/home/root/my_binary检查二进制依赖的动态库是否全部存在,如果有缺失的库,需要安装对应的包。 - 输出管道阻塞:如果
my_binary输出大量内容,不调用communicate()会导致管道满而阻塞子进程,最终崩溃,这也是为什么必须用communicate()来读取输出的原因。
内容的提问来源于stack exchange,提问作者stonecrusher
相关产品推荐
相关产品推荐

