Reputation: 3871
I have a loop where I run an installed program using
os.system("program + arguments")
passing each element in the loop as an argument to the program. Runtime of the program changes according to the argument, sometimes it takes a second and sometimes it takes hours. So I want to kill the program when it took more than an hour and proceed to the next element in the loop.
I tried to use the second answer here (because I couldn't understand how I could use the best answer) Python: Run a process and kill it if it doesn't end within one hour by replacing os.sytem("program+arguments")
to subprocess.Popen(["program+arguments"])
but it gives "No such file or directory error"
, I'm sure I'm passing the arguments correctly, could you help me how I can apply such solution?
Here is the error message,
subp = subprocess.Popen(["home/admin/Desktop/molblocks/fragment -i " + OrgDir+"/"+compsmi + " -r "+ RulesPath + " -e -n "+str(FragLength) + " -o " + compsmi + "_frag.txt"])
File "/usr/lib64/python2.7/subprocess.py", line 709, in __init__
errread, errwrite)
File "/usr/lib64/python2.7/subprocess.py", line 1326, in _execute_child
raise child_exception
Best Regards!
Upvotes: 1
Views: 764
Reputation: 106
On Unix, if args is a string, the string is interpreted as the name or path of the program to execute. However, this can only be done if not passing arguments to the program. (When shell is not True)
https://docs.python.org/2/library/subprocess.html#subprocess.Popen.
Try this:
subp = subprocess.Popen(["home/admin/Desktop/molblocks/fragment", "-i", (OrgDir+"/"+compsmi), "-r", RulesPath, "-e", "-n", str(FragLength), "-o", (compsmi+"_frag.txt")])
Upvotes: 1
Reputation: 77407
You can setup a timer to kill the process like so
import subprocess
import threading
proc = subprocess.call("program + arguments", shell=True)
timer = threading.Timer(3600, proc.kill)
timer.cancel()
proc.wait()
The call
, check_call
and Popen
calls accept programs in two forms. Either a single string ("program arg1 arg2") that should be passed to a subshell (you need shell=True
to make it work) or a list of parameters ["program", "arg1", "arg2"] (shell=True
is optional an on linux a bit more efficient if you don't use a subshell). You put put the program + args as a single item in a list and python dutifully escaped all of the separators and tried to run a program of that whole name.
Upvotes: 0