我正在尝试使用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”块中打印我的自定义消息。如果已经存在,我可以强制该功能在创建组时打印自定义消息。
答案 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
的另一个好处是,您可以控制命令输出的定向位置。如果您要放弃stderr
或stdout
,可以将其重定向到/dev/null
,而无需依赖shell来为您执行此操作:
subprocess.check_call(adminGroupCommand, stderr=os.devnull, stdout=os.devnull)
还有可能重定向到subprocess.PIPE
,这允许你的python代码从子进程中读取标准输出或标准错误。