检查子进程调用是否成功执行

3

我正在自学 Python,想为我的服务器创建一个小脚本,可以在我登录时告诉我硬盘是否已经挂载,如果没有,就自动挂载它(我把它放在 ~/.bashrc 中)。

我面临的问题是:

try:
    with open('/media/Hitachi/mountfile.txt', 'r') as f:
        print(f.readline())
except:
        print('HDD is not mounted')
        if not os.path.exists('/media/Hitachi/media'):
                print('Attempting to mount HDD')
                script = subprocess.call('mountscript.sh', shell=True)

我该如何判断mountscript.sh是否成功?

2
如果我没记错,subprocess.call返回退出代码..所以你可以检查脚本是否等于0? - Gryphius
2个回答

4

subprocess.call 方法返回进程的 returncode,因此您可以检查它以确定调用是否成功。

>>> subprocess.call(["ls", "-l"])
0
>>> subprocess.call("exit 1", shell=True)
1

0
为什么不使用简单的if/else语句并使用check_call呢?
if os.path.exists('/media/Hitachi/mountfile.txt'):
    print("it's mounted")
else:
    print('HDD is not mounted')
    if not os.path.exists('/media/Hitachi/media'):
        print('Attempting to mount HDD')
        script = subprocess.check_call(['mountscript.sh','2>file.txt'], shell=True)

无论如何,这个故事的寓意是不要忘记在subprocess.call()或check_call()命令参数周围加上括号。


1
因为我正在尝试教自己其他方法,所以即使这种方法不太简单,它也是我自己的学习练习。 - Joseph
try-except结构仅用于处理模块可能抛出的异常。它永远不应该被用作if-else的替代方案。 - Back2Basics
谢谢:),顺便问一下,有没有办法将可能遇到的Unix错误导入到文本文件中? - Joseph
可能不会按预期工作或者至少风格不好:如果你使用 shell=True,你应该使用一个字符串,而不是一个字符串列表。最好这样做:with open("file.txt", "w") as f: script = subprocess.check_call(['mountscript.sh'], stderr=f) - glglgl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接