KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I want to execute a process, limit the execution-time by some timeout in seconds and grab the output produced by the process. And I want to do this on windows, linux and freebsd. I have tried implementing this in three different ways: cmd - Without timeout and subprocess.PIPE for output capture. BEHAVIOUR: Operates as expected but does not support timeout, i need timeout... cmd_to - With timeout and subprocess.PIPE for output capture. BEHAVIOUR: Blocks subprocess execution when output >= 2^16 bytes. cmd_totf - With timeout and tempfile.NamedTemporaryfile for output capture. BEHAVIOUR: Operates as expected but uses temporary files on disk. These are available below for closer inspection. As can be seen in the output below, then the timeout-code blocks the execution of the sub-process when using subprocessing.PIPE and output from the subprocess is >= 2^16 bytes. The subprocess documentation states that this is expected when calling process.wait() and using subprocessing.PIPE, however no warnings are given when using process.poll(), so what is going wrong here? I have a solution in cmd_totf which use the tempfile module but the tradeoff is that it writes the output to disk, something I would REALLY like to avoid. So my questions are: What am I doing wrong in cmd_to? Is there a way to do what I want and without using tempfiles / keeping the output in memory. Script to generate a bunch of output ('exp_gen.py'): #!/usr/bin/env python import sys output = "b"*int(sys.argv[1]) print output Three different implementations (cmd, cmd_to, cmd_totf) of wrappers around subprocessing.Popen: #!/usr/bin/env python import subprocess, time, tempfile bufsize = -1 def cmd(cmdline, timeout=60): """ Execute cmdline. Uses subprocessing and subprocess.PIPE. """
Tags (comma-separated)
Save Edits
Cancel