1

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!

9
  • You could try spawning it in a different thread, then kill the thread. Commented Oct 28, 2016 at 21:21
  • show the command line you're trying to execute. program+arguments is essentially useless. You ARE calling popen properly, but whatever you're passing in is WRONG, hence "no such file or directory". Commented Oct 28, 2016 at 21:25
  • if it's under windows, you probably forgot to quote a path, so that .popen("c:\program files\blah blah blah" is trying to execute a program named c:\program with arguments files\blah blah blah Commented Oct 28, 2016 at 21:26
  • @MarcB I twice checked the paths and they're alright, it's under linux Commented Oct 28, 2016 at 21:29
  • "alright" doesn't help us figure out the problem. Show the command. Commented Oct 28, 2016 at 21:30

2 Answers 2

1

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")])
Sign up to request clarification or add additional context in comments.

Comments

0

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.

2 Comments

Thanks, i'll try it. Python documentation says, using shell=True can be a security hazard, is it safe to use this method since I share a server with other people?
As for security, its kinda like a sql injection attack for the shell. Suppose you take input from an untrusted user and instead of a user name somebody types ";rm -rf /" - the shell saw the semicolon, started a new command, and you just blew your server away! The fix is easy, you could call shlex.quote for that field. Python does the same thing when you use the list form. In ["prog", ";rm -rf /"] that second arg is quoted and is safe. shell=true is fine as long as you quote any bits of data from users.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.