How to run Open Pose binary (.exe) from within a Python script?

795 Views Asked by At

I am making a body tracking application where I want to run Open Pose if the user chooses to track their body movements. The OpenPose binary file can be run like so:

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

So, in my Python script, I want to have a line of code that would run Open Pose, instead of having to ask the user to manually run OpenPose by opening a separate command line window. For that, I have tried:

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

But this gives the following error:

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?

Which I guess means that OpenPose can be opened only by going inside the openpose directory where the bin subdirectory resides. So, I wrote a shell script containing this line:

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

and saved it as run_openpose_binary.sh in the openpose directory (i.e., the same directory where bin is located).

I then tried to run this shell script from within my Python script like so:

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

and this gives the following error:

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

I also tried the following:

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

and

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

These do not produce any error, but instead just pop up a blank window and closes.

So, my question is, how do I run the OpenPoseDemo.exe from within my Python script?

2

There are 2 best solutions below

6
On

For your last method, you're missing the return value from os.popen, which is a pipe. So, what you need is something like:

# 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

or, if you want to future-proof yourself, the alternative is:

# 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='')

Leave a comment if you have further difficulty.

0
On

I've had to fight this battle several times and I've found a solution. It's likely not the most elegant solution but it does work, and I'll explain it using an example of how to run OpenPose on a video. You've got your path to the openpose download and your path to the video, and from there it's a 3-line solution. First, change the current working directory to that openpose folder, and then create your command, then call subprocess.run (I tried using subprocess.call and that did not work. I did not try shell=False but I have heard it's a safer way to do so. I'll leave that up to you.)

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)