Skip to content

Instantly share code, notes, and snippets.

@kirpit
Last active March 17, 2023 06:29
Show Gist options
  • Star 37 You must be signed in to star a gist
  • Fork 15 You must be signed in to fork a gist
  • Save kirpit/1306188 to your computer and use it in GitHub Desktop.
Save kirpit/1306188 to your computer and use it in GitHub Desktop.
Enables to run subprocess commands in a different thread with TIMEOUT option!
#! /usr/bin/env python
import threading
import subprocess
import traceback
import shlex
class Command(object):
"""
Enables to run subprocess commands in a different thread with TIMEOUT option.
Based on jcollado's solution:
http://stackoverflow.com/questions/1191374/subprocess-with-timeout/4825933#4825933
"""
command = None
process = None
status = None
output, error = '', ''
def __init__(self, command):
if isinstance(command, basestring):
command = shlex.split(command)
self.command = command
def run(self, timeout=None, **kwargs):
""" Run a command then return: (status, output, error). """
def target(**kwargs):
try:
self.process = subprocess.Popen(self.command, **kwargs)
self.output, self.error = self.process.communicate()
self.status = self.process.returncode
except:
self.error = traceback.format_exc()
self.status = -1
# default stdout and stderr
if 'stdout' not in kwargs:
kwargs['stdout'] = subprocess.PIPE
if 'stderr' not in kwargs:
kwargs['stderr'] = subprocess.PIPE
# thread
thread = threading.Thread(target=target, kwargs=kwargs)
thread.start()
thread.join(timeout)
if thread.is_alive():
self.process.terminate()
thread.join()
return self.status, self.output, self.error
@davidyoung8906
Copy link

I use the cmd to start a java program. I find that the thread will keep running after thread.join()

@sunway1988
Copy link

Now we can use timeout in Ubuntu 10.04 and later versions happily.

@onkar27
Copy link

onkar27 commented Jul 3, 2017

Solution.java is

class Solution{
      public static void main(String [] args){ 
              do
                    System.out.println("Helloo");
              while(true);
      }
}

and

command = Command("java Solution")
print command.run(timeout=1, shell=True ,stderr=subprocess.STDOUT, stdout=subprocess.PIPE)

Timeout does not works !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment