如何处理python中的操作系统错误

时间:2015-06-24 12:39:40

标签: python operating-system

我正在尝试使用python创建linux组.Below是用于创建组的函数。

def createGroups(self):
        adminGroupCommand="groupadd "+ self.projectName+'admin'
        userGroupCommand="groupadd "+ self.projectName+'user'
        try:
            os.system(adminGroupCommand)
        except OSError as err:
            print("group already exists: "+adminGroupCommand)
        try:
            os.system(userGroupCommand)
        except OSError as err:
            print("group already exists: "+userGroupCommand)

该功能成功创建了群组。但如果我再次运行相同的功能,它会在运行时给出以下输出

groupadd: group 'akphaadmin' already exists
groupadd: group 'akphauser' already exists

它不在“except”块中打印我的自定义消息。如果已经存在,我可以强制该功能在创建组时打印自定义消息。

1 个答案:

答案 0 :(得分:1)

函数os.system不以这种方式报告命令行中的错误。如果你很幸运,你将获得返回代码(成功时应该为零),但根据文档你不能依赖它。

相反,文档建议改为使用subprocess模块:

def createGroups(self):
    adminGroupCommand="groupadd "+ self.projectName+'admin'
    userGroupCommand="groupadd "+ self.projectName+'user'
    try:
        subprocess.check_call(adminGroupCommand, shell=True)
    except subprocess.CalledProcessError:
        print("group already exists: "+adminGroupCommand)
    try:
        subprocess.check_call(userGroupCommand, shell=True)
    except subprocess.CalledProcessError as err:
        print("group already exists: "+userGroupCommand)

CalledProcessError有一个属性returncode,您可以检查groupadd命令是否有不同的失败原因返回代码。

另请注意,shell=True表示您依赖命令解释程序转发返回代码(可能并非总是如此)。相反,你可以直接调用命令:

adminGroupCommand=["groupadd", self.projectName, 'admin']
...
try:
    subprocess.check_call(adminGroupCommand)

...还有一个好处,即如果self.projectName包含空格,星号(或命令行解释器可能解释的其他字符),它们将以未修改的形式发送到命令(作为单个命令行参数) )。

使用subprocess的另一个好处是,您可以控制命令输出的定向位置。如果您要放弃stderrstdout,可以将其重定向到/dev/null,而无需依赖shell来为您执行此操作:

subprocess.check_call(adminGroupCommand, stderr=os.devnull, stdout=os.devnull)

还有可能重定向到subprocess.PIPE,这允许你的python代码从子进程中读取标准输出或标准错误。