如何在Python脚本中运行OpenPose二进制文件(.exe)
如何在Python脚本中正确运行OpenPoseDemo.exe
看起来你在Windows环境下运行OpenPose二进制文件时遇到了几个典型问题,我来一步步帮你解决:
核心问题分析
- 工作目录错误:OpenPose需要在它的根目录(也就是包含
bin文件夹的那个目录)下运行,因为它要加载依赖的动态链接库(DLL)和配置文件,直接指定exe路径但不切换工作目录会导致各种依赖或路径解析错误。 - Shell脚本不兼容Windows:
.sh是Linux/macOS的脚本格式,Windows默认没有sh解释器,所以直接运行会找不到文件,或者被系统用记事本打开后一闪而过,根本没执行命令。 - 引号使用错误:Windows命令行只识别双引号
",你之前用单引号'包裹输出路径会导致系统无法正确解析目标目录。
解决方案一:直接用Python的subprocess指定工作目录运行
这是最简洁的方法,不需要额外写脚本,直接在Python中配置好路径和工作目录即可:
import subprocess import os # 替换成你的OpenPose根目录(bin文件夹所在的目录) openpose_root = r"C:\path\to\openpose" # 拼接OpenPoseDemo.exe的完整路径 demo_exe_path = os.path.join(openpose_root, "bin", "OpenPoseDemo.exe") # 替换成你的JSON输出目录(有空格的话也不用额外加引号,subprocess会自动处理) output_json_path = r"C:\path\to\dump\output" # 构造命令参数列表(用列表形式避免手动处理引号的麻烦) command = [ demo_exe_path, "--write_json", output_json_path ] # 运行命令,指定工作目录为OpenPose根目录 try: result = subprocess.run( command, cwd=openpose_root, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) print("OpenPose运行成功!") print("程序输出:", result.stdout) except subprocess.CalledProcessError as e: print("OpenPose运行失败,错误信息:") print(e.stderr)
为什么这个方法有效:
cwd=openpose_root强制Python在OpenPose根目录下执行命令,确保程序能找到所有依赖文件。- 用列表形式传递命令参数,避免了手动处理引号的麻烦,subprocess会自动处理路径中的空格等特殊字符。
check=True会在命令执行失败时抛出异常,结合stdout和stderr捕获输出,方便你调试问题。
解决方案二:写Windows批处理脚本(.bat)运行
如果你还是想用脚本的方式,把.sh换成Windows原生支持的批处理文件.bat:
- 在OpenPose根目录创建
run_openpose.bat,内容如下:
@echo off :: 替换成你的JSON输出目录,有空格的话用双引号包裹 bin\OpenPoseDemo.exe --write_json "C:\path\to\dump\output"
- 在Python中运行这个批处理文件:
import subprocess bat_file_path = r"C:\path\to\openpose\run_openpose.bat" openpose_root = r"C:\path\to\openpose" try: result = subprocess.run( bat_file_path, cwd=openpose_root, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) print("批处理运行成功!") print(result.stdout) except subprocess.CalledProcessError as e: print("批处理运行失败:") print(e.stderr)
额外注意事项
- 确保输出目录的父文件夹已经存在,并且你有写入权限(尽量避免写到系统盘的受保护目录,比如
C:\Windows)。 - 尽量避免使用
os.popen或os.system,这两个方法比较老旧,错误处理和安全性都不如subprocess.run。
内容的提问来源于stack exchange,提问作者Kristada673
相关产品推荐
相关产品推荐

