You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python脚本中运行OpenPose二进制文件(.exe)

如何在Python脚本中正确运行OpenPoseDemo.exe

看起来你在Windows环境下运行OpenPose二进制文件时遇到了几个典型问题,我来一步步帮你解决:

核心问题分析

  1. 工作目录错误:OpenPose需要在它的根目录(也就是包含bin文件夹的那个目录)下运行,因为它要加载依赖的动态链接库(DLL)和配置文件,直接指定exe路径但不切换工作目录会导致各种依赖或路径解析错误。
  2. Shell脚本不兼容Windows:.sh是Linux/macOS的脚本格式,Windows默认没有sh解释器,所以直接运行会找不到文件,或者被系统用记事本打开后一闪而过,根本没执行命令。
  3. 引号使用错误: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:

  1. 在OpenPose根目录创建run_openpose.bat,内容如下:
@echo off
:: 替换成你的JSON输出目录,有空格的话用双引号包裹
bin\OpenPoseDemo.exe --write_json "C:\path\to\dump\output"
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 17:22:28