Subprocess does not return for longer-running process

Jason Friedman jsf80238 at gmail.com
Tue Sep 21 18:06:00 EDT 2010


Hello,

The Popen call does not return if the underlying OS call runs longish,
as the example below shows.
Although, if the underlying OS call is merely "sleep N" it will return
even after quite a long time.

wikiuser at dvprwiki1:~> python --version
Python 2.6.4

wikiuser at dvprwiki1:~> time /opt/confluence-cli-1.5.0/confluence.sh
--action getPageList --space TIS --user cli --password cli | head -1
132 pages in list

real    0m1.245s
user    0m1.482s
sys     0m0.153s

wikiuser at dvprwiki1:~> time /opt/confluence-cli-1.5.0/confluence.sh
--action getPageList --space Oncall --user cli --password cli | head
-1
19645 pages in list

real    0m14.425s
user    0m9.866s
sys     0m1.110s

wikiuser at dvprwiki1:~> cat $HOME/scripts/subprocess_test.py
#!/usr/bin/env python
import os, sys
from subprocess import Popen, PIPE
def execute(command_list=["sleep", "1"]):
    process = Popen(command_list, shell=False, stdout=PIPE)
    (pid, exit_code) = os.waitpid(process.pid, 0)
    if process.stdout != None:
        print process.stdout.read()
    if process.stderr != None:
        print process.stderr.read()
    return exit_code
if __name__ == "__main__":
    if len(sys.argv) > 1:
        execute(sys.argv[1].split())
    else:
        execute()

wikiuser at dvprwiki1:~> time $HOME/scripts/subprocess_test.py
"/opt/confluence-cli-1.5.0/confluence.sh --action getPageList --space
TIS --user cli --password cli" | head -1
132 pages in list

real    0m1.233s
user    0m1.437s
sys     0m0.169s

wikiuser at dvprwiki1:~> time $HOME/scripts/subprocess_test.py
"/opt/confluence-cli-1.5.0/confluence.sh --action getPageList --space
Oncall --user cli --password cli" | head -1
Traceback (most recent call last):
  File "$HOME/scripts/subprocess_test.py", line 18, in <module>
    execute(sys.argv[1].split())
  File "$HOME/scripts/subprocess_test.py", line 9, in execute
    (pid, exit_code) = os.waitpid(process.pid, 0)
KeyboardInterrupt

real    1m25.306s
user    0m0.021s
sys     0m0.035s

(Note I killed this last command with CNTL-C.)



More information about the Python-list mailing list