如何使用几个subprocess.check_输出非零和避免状态67

2024-10-01 15:48:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚开始学习python,所以这可能是显而易见的。我正在尝试创建一个脚本,它将根据组成员身份更改OSX10.9中的桌面图片。 如果我只检查一件事,脚本就可以了。当我试图在它上面花费的时候,我失败了。 我尝试过将所有声明放在if-else之前,也尝试过用if-elif-else。在

如何让python使用多个呢subprocess.check_输出在一行?在

脚本会随着这个回溯而消亡:

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

如果我自己运行命令,就可以:

$dseditgroup-o checkmember-m根学生
没有根不是学生的一员

以下是我目前为止的剧本:

#!/usr/bin/python
# This script checks the user's membership to groups in order to set the Desktop Picture.

from AppKit import NSWorkspace, NSScreen
from 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 a 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':
    for 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':
        for 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':
        for screen in NSScreen.screens():
            (result, error) = ws.setDesktopImageURL_forScreen_options_error_(
                                                                     lu_file_url, screen, options, None)
# not sure about this ending
else:
    exit0

Tags: pathinurloutputifchecklibraryerror
1条回答
网友
1楼 · 发布于 2024-10-01 15:48:04

非零退出状态表示存在错误或其他异常退出。在

从您的命令输出中可以清楚地看到错误,实际上错误消息是作为结果显示的,不同的是您的shell抑制了错误代码。要查看退出代码是什么,请键入echo "$?",下面是一个示例:

$ dseditgroup -o checkmember -m root students
Group not found.
$ echo "$?"
64

在这里,命令返回退出代码64。输出被写入stderr标准错误缓冲区。在shell中,它看起来是一样的,因为它将同时打印stdout(标准输出)和stderr,但是请注意,如果我将stderr重定向到一个文件,则不会看到任何输出:

^{pr2}$

您可以通过捕获脚本中写入stderr的任何输出来避免异常。这在documentation中也有详细说明:

check_admin_user = subprocess.check_output(
                     ['dseditgroup', '-o' , 'checkmember', '-m', username, 'admin'],
                     stderr=subprocess.STDOUT
                   )

我还根据Python style guide更改了变量名。在

相关问题 更多 >

    热门问题