【问题标题】:How to run Open Pose binary (.exe) from within a Python script?如何从 Python 脚本中运行 Open Pose 二进制文件 (.exe)?
【发布时间】:2020-07-30 10:55:27
【问题描述】:

我正在制作一个身体跟踪应用程序,如果用户选择跟踪他们的身体动作,我想在其中运行 Open Pose。 OpenPose 二进制文件可以这样运行:

bin\OpenPoseDemo.exe --write_json 'path\to\dump\output'

因此,在我的 Python 脚本中,我希望有一行代码可以运行 Open Pose,而不必通过打开单独的命令行窗口来要求用户手动运行 OpenPose。为此,我已经尝试过:

import os
os.popen(r"C:\path\to\bin\OpenPoseDemo.exe --write_json 'C:\path\to\dump\output'")

但这会产生以下错误:

Error:
Could not create directory: 'C:\Users\Admin\Documents\Openpose\. Status error = -1. Does the parent folder exist and/or do you have writing access to that path?

我猜这意味着 OpenPose 只能通过进入 bin 子目录所在的 openpose 目录来打开。所以,我写了一个包含这一行的 shell 脚本:

bin\OpenPoseDemo.exe --write_json 'C:\path\to\dump\output'

并在openpose目录(即bin所在的同一目录)中保存为run_openpose_binary.sh

然后我尝试从我的 Python 脚本中运行这个 shell 脚本,如下所示:

import subprocess
subprocess.call(['sh', r'C:\path\to\openpose\run_openpose_binary.sh'])

这会产生以下错误:

FileNotFoundError: [WinError 2] The system cannot find the file specified

我还尝试了以下方法:

os.popen(r"C:\path\to\openpose\run_openpose_binary.sh")

os.system(r"C:\path\to\openpose\run_openpose_binary.sh")

这些不会产生任何错误,而是会弹出一个空白窗口并关闭。

那么,我的问题是,如何从我的 Python 脚本中运行 OpenPoseDemo.exe?

【问题讨论】:

    标签: python computer-vision exe executable openpose


    【解决方案1】:

    对于您的最后一个方法,您缺少来自 os.popen 的返回值,它是一个管道。所以,你需要的是这样的:

    # untested as I don't have access to a Windows system
    import os
    
    
    with os.popen(r"/full/path/to/sh C:/path/to/openpose/run_openpose_binary.sh") as p:
        # pipes work like files
        output_of_command = p.read().strip() # this is a string
    

    或者,如果您希望自己适应未来,另一种选择是:

    # untested as I don't have access to a Windows system
    popen = subprocess.Popen([r'/full/path/to/sh.exe', r'/full/path/to/run_openpose_binary.sh')],  stdin=subprocess.PIPE, stdout=subprocess.PIPE,encoding='utf-8')
    stdout, stderr = popen.communicate(input='')
    

    如果您还有其他困难,请发表评论。

    【讨论】:

    • 你的方法我都试过了。第一种方法产生的输出与我在上一种方法中提到的相同,即它只是弹出一个空白窗口并关闭。在您的第二种方法中(通过将)] 替换为] 来修复语法错误之后),我收到以下错误:OSError: [WinError 193] %1 is not a valid Win32 application
    • 现在试试?我错过了外壳指示符。
    • 还是一样。第一种方法只是弹出一个空白窗口并关闭。而第二种方法这次产生了不同的错误:PermissionError: [WinError 5] Access is denied.
    • 然后尝试以超级用户身份运行第二个?
    • 是的,但我如何在 Windows 中做到这一点?我用谷歌搜索,所有答案似乎都是针对 unix/linux 的。我实际上对 Windows 不太熟悉,但我不得不在这个项目中使用 WINdows,因为我的 MacBook 没有 Nvidia GPU,而且这个项目需要一个 Nvidia GPU 才能运行:(
    【解决方案2】:

    我不得不多次打这场仗,我找到了解决办法。这可能不是最优雅的解决方案,但它确实有效,我将使用如何在视频上运行 OpenPose 的示例来解释它。 您已经获得了 openpose 下载路径和视频路径,从那里它是一个 3 行解决方案。首先,将当前工作目录更改为该 openpose 文件夹,然后创建您的命令,然后调用 subprocess.run (我尝试使用 subprocess.call 但没有奏效。我没有尝试 shell=False 但我听说它更安全方法。我会留给你。)

    import os
    import subprocess
    
    openpose_path = "C:\\Users\\me\\Desktop\\openpose-1.7.0-binaries-win64-gpu-python3.7-flir-3d_recommended\\openpose\\"
    video_path = "C:\\Users\\me\\Desktop\\myvideo.mp4"
    os.chdir(openpose_path)
    command = "".join(["bin\\OpenPoseDemo.exe", " -video ", video_path])
    subprocess.run(command, shell=True)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-12
      • 2017-05-31
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 2012-01-31
      • 2021-10-20
      相关资源
      最近更新 更多