Skip to content

Instantly share code, notes, and snippets.

Last active March 17, 2023 06:29
  • Star 37 You must be signed in to star a gist
  • Fork 15 You must be signed in to fork a gist
Star You must be signed in to star a gist
What would you like to do?
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:
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):
self.process = subprocess.Popen(self.command, **kwargs)
self.output, self.error = self.process.communicate()
self.status = self.process.returncode
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)
if thread.is_alive():
return self.status, self.output, self.error
Copy link

I get:

Traceback (most recent call last):
File "./", line 34, in
File "./", line 31, in run
return self.process.returncode
AttributeError: 'NoneType' object has no attribute 'returncode'

Copy link

ogasser commented Aug 31, 2012

Pass shell=True if you want Popen to execute the program in a shell. Beware of maclicious input though!


command = Command("echo 'Process started'; sleep 2; echo 'Process finished'"), shell=True)

Copy link

command = Command('ping -t')
print, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, shell=True)

Not work on Window7, Python 2.7.

Copy link

kirpit commented Dec 29, 2012

all these complains should be satisfied now with the latest revision.

it should also be able to run commands even though no shell=True argument provided, which is done by shlex splitting..

Copy link

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

Copy link

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

Copy link

onkar27 commented Jul 3, 2017 is

class Solution{
      public static void main(String [] args){ 


command = Command("java Solution")
print, 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