python - How to use several subprocess.check_output and avoid non-zero exit status 67 -
i'm @ beginning of learning python, may obvious. i'm trying create script change desktop pictures in os x 10.9 according group membership. if check 1 thing, script works. it's when try expend on fail. i've tried putting declarations before if else, tried if elif else.
how 1 python use several subprocess.check_output in row?
the script dies traceback:
traceback (most recent call last):
file "/library/setdesktopimages/setdesktopimages.py", line 36, in module
checkstudentuser = subprocess.check_output(['dseditgroup', '-o' , 'checkmember', '-m', username, 'students'])
file "/system/library/frameworks/python.framework/versions/2.7/lib/python2.7/subprocess.py", line 575, in check_output
raise calledprocesserror(retcode, cmd, output=output)
subprocess.calledprocesserror: command '['dseditgroup', '-o', 'checkmember', '-m', 'root', 'students']' returned non-zero exit status 67
if run command itself, fine:
$ dseditgroup -o checkmember -m root students
no root not member of students
here script far:
#!/usr/bin/python # script checks user's membership groups in order set desktop picture. appkit import nsworkspace, nsscreen foundation import nsurl import getpass import subprocess network_user_path = "/library/desktop pictures/abstract.jpg" ladmin_path = "/library/desktop pictures/desert.jpg" luser_path = "/library/desktop pictures/flamingos.jpg" # generate fileurl nu_file_url = nsurl.fileurlwithpath_(network_user_path) la_file_url = nsurl.fileurlwithpath_(ladmin_path) lu_file_url = nsurl.fileurlwithpath_(luser_path) username=getpass.getuser() options = {} ws = nsworkspace.sharedworkspace() checkadminuser = subprocess.check_output(['dseditgroup', '-o' , 'checkmember', '-m', username, 'admin']) isadmin = subprocess.check_output(['echo', checkadminuser, '|', 'cut', '-d', '-f1', '|', 'awk', '{print $1}']) if isadmin == 'yes': screen in nsscreen.screens(): (result, error) = ws.setdesktopimageurl_forscreen_options_error_( la_file_url, screen, options, none) else: checkstudentuser = subprocess.check_output(['dseditgroup', '-o' , 'checkmember', '-m', username, 'students']) isstudent = subprocess.check_output(['echo', checkstudentuser, '|', 'cut', '-d', '-f1', '|', 'awk', '{print $1}']) if isstudent == 'yes': screen in nsscreen.screens(): (result, error) = ws.setdesktopimageurl_forscreen_options_error_( nu_file_url, screen, options, none) else: checklocaluser = subprocess.check_output(['dseditgroup', '-o' , 'checkmember', '-m', username, 'localaccounts']) islocal = subprocess.check_output(['echo', checklocaluser, '|', 'cut', '-d', '-f1', '|', 'awk', '{print $1}']) if islocal == 'yes': screen in nsscreen.screens(): (result, error) = ws.setdesktopimageurl_forscreen_options_error_( lu_file_url, screen, options, none) # not sure ending else: exit0
a non-zero exit status means there error, or other abnormal exit.
its clear command output there was error, in fact error message shown result, difference shell suppresses error code. see exit code was, type echo "$?"
, here example:
$ dseditgroup -o checkmember -m root students group not found. $ echo "$?" 64
here command returned exit code 64
. output written stderr
standard error buffer. in shell looks same because print both stdout
(standard output) , stderr
, notice if redirect stderr
file, don't see output:
$ dseditgroup -o checkmember -m root students 2&> ~/out.txt $ echo "$?" 64 $ cat ~/out.txt group not found.
you can avoid exception capturing output written stderr
in script. detailed in documentation:
check_admin_user = subprocess.check_output( ['dseditgroup', '-o' , 'checkmember', '-m', username, 'admin'], stderr=subprocess.stdout )
i changed variable names per python style guide.
Comments
Post a Comment