I have a script where I launch with popen a shell command.
The problem is that the script doesn’t wait until that popen command is finished and go continues right away.
om_points = os.popen(command, "w") .....
How can I tell to my Python script to wait until the shell command has finished?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Depending on how you want to work your script you have two options. If you want the commands to block and not do anything while it is executing, you can just use subprocess.call.
#start and block until done subprocess.call([data["om_points"], ">", diz['d']+"/points.xml"])
If you want to do things while it is executing or feed things into stdin, you can use communicate after the popen call.
#start and process things, then wait p = subprocess.Popen([data["om_points"], ">", diz['d']+"/points.xml"]) print "Happens while running" p.communicate() #now wait plus that you can send commands to process
As stated in the documentation, wait can deadlock, so communicate is advisable.
Method 2
You can you use subprocess to achieve this.
import subprocess #This command could have multiple commands separated by a new line n some_command = "export PATH=$PATH://server.sample.mo/app/bin n customupload abc.txt" p = subprocess.Popen(some_command, stdout=subprocess.PIPE, shell=True) (output, err) = p.communicate() #This makes the wait possible p_status = p.wait() #This will give you the output of the command being executed print "Command output: " + output
Method 3
Force popen to not continue until all output is read by doing:
os.popen(command).read()
Method 4
Let the command you are trying to pass be
os.system('x')
then you covert it to a statement
t = os.system('x')
now the python will be waiting for the output from the commandline so that it could be assigned to the variable t.
Method 5
What you are looking for is the wait method.
Method 6
wait() works fine for me. The subprocesses p1, p2 and p3 are executed at the same. Therefore, all processes are done after 3 seconds.
import subprocess
processes = []
p1 = subprocess.Popen("sleep 3", stdout=subprocess.PIPE, shell=True)
p2 = subprocess.Popen("sleep 3", stdout=subprocess.PIPE, shell=True)
p3 = subprocess.Popen("sleep 3", stdout=subprocess.PIPE, shell=True)
processes.append(p1)
processes.append(p2)
processes.append(p3)
for p in processes:
if p.wait() != 0:
print("There was an error")
print("all processed finished")
Method 7
I think process.communicate() would be suitable for output having small size. For larger output it would not be the best approach.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0