I am trying to write a small app that uses the subprocess
module.
My program calls an external Bash command that takes some time to process. During this time, I would like to show the user a series of messages like this:
Processing. Please wait...
The output is foo()
How can I do this using Popen.wait()
or Popen.poll()
. I have read that I need to use the Popen.returncode
, but how I can get it to actively check the state, I don't know.
Both wait() and poll() return the process's exit code if the process has finished. The poll() method will return None if the process is still running and the wait() method will block until the process exits: Check out the following page: https://docs.python.org/3.4/library/subprocess.html#popen-objects.
subprocess. run() is synchronous which means that the system will wait till it finishes before moving on to the next command.
Popen is nonblocking. call and check_call are blocking. You can make the Popen instance block by calling its wait or communicate method.
Both wait()
(with timeout
specified) and poll()
return None
if the process has not yet finished, and something different if the process has finished (I think an integer, the exit code, hopefully 0).
Edit:
wait()
and poll()
have different behaviors:
wait
(without the timeout argument) will block and wait for the process to complete.wait
with the timeout argument will wait timeout
seconds for the process to complete. If it doesn't complete, it will throw the TimeoutExpired
exception. If you catch the exception, you're then welcome to go on, or to wait
again.poll
always returns immediately. It effectively does a wait with a timeout of 0, catches any exception, and returns None
if the process hasn't completed.wait
or poll
, if the process has completed, the popen object's returncode
will be set (otherwise it's None - you can check for that as easily as calling wait
or poll
), and the return value from the function will also be the process's return code.</Edit>
So I think you should do something like:
while myprocess.poll() is None: print("Still working...") # sleep a while
Be aware that if the bash script creates a lot of output you must use communicate()
or something similar to prevent stdout or stderr to become stuffed.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With