python subprocess.check_调用未引发RPC进程内linux上失败调用的异常

python subprocess.check_调用未引发RPC进程内linux上失败调用的异常,python,linux,error-handling,subprocess,Python,Linux,Error Handling,Subprocess,编辑:添加此问题似乎与从RPC进程中对标题进行这些调用密切相关。我以为我会被要求使用RPC来完成我正在做的事情,但我错了。 从该进程中提取代码并从服务器上运行后,它将按预期工作。我决定留下这个问题,而不是删除它,以防其他人发现有用的评论 正如标题所示,当子进程check_调用失败时,CalledProcessError不会触发my except块 我的代码相当简单,我有一个UNC路径,我想挂载到本地目录。如果它不存在,我们将创建并装载它。然后,我们将export_文件推送到挂载共享上的一个子目录

编辑:添加此问题似乎与从RPC进程中对标题进行这些调用密切相关。我以为我会被要求使用RPC来完成我正在做的事情,但我错了。
从该进程中提取代码并从服务器上运行后,它将按预期工作。我决定留下这个问题,而不是删除它,以防其他人发现有用的评论

正如标题所示,当子进程check_调用失败时,CalledProcessError不会触发my except块

我的代码相当简单,我有一个UNC路径,我想挂载到本地目录。如果它不存在,我们将创建并装载它。然后,我们将export_文件推送到挂载共享上的一个子目录(如果需要,我们将创建该子目录)。如果这些操作中的任何一个失败,我们希望将其记录下来并退出。最后,我们卸载该共享

我尝试使用“&&”分隔符进行一次调用,但这似乎只是在出现问题时才让事情变得复杂。在使用subprocess.check_call()将所有操作分离为它们自己的调用之后,我得到了已知良好情况下所需的结果,问题是我想通过设置export_file=None重新使用此代码作为可装载性测试

代码如下:

def export_backup(local_dir, remote_dir, creds, export_file=None):
    """
    process for testing UNC path mountability and for exporting file to UNC path
    :param local_dir: path for local dir to be used as mount point
    :param remote_dir: UNC for remote path to mount to local dir
    :param creds: dictionary with keys: 'username', 'domain', and 'password' (set value to None if non-existent)
    :param export_file: path to file for exporting, set to None to simply test mountability of remote_dir
    """
    try:
        # in case we failed to unmount for whatever reason
        if os.path.ismount(local_dir):
            # unmount existing mount
            subprocess.check_call(['sudo', 'umount', '-l', local_dir])
        elif not os.path.isdir(local_dir):
            # create new directory
            subprocess.check_call(['sudo', 'mkdir', local_dir])
        # mount path
        cmd = ['sudo', 'mount', '-t', 'cifs']
        # build creds
        cred_string = ','.join(['{0}={1}'.format(key, value) for (key, value) in creds.items() if value])
        if cred_string:
            cmd.extend(['-o', cred_string])
        cmd.extend([remote_dir, local_dir])
        subprocess.check_call(cmd)
        if export_file:
            export_dir = os.path.join(local_dir, '{0}-appl-export'.format(gethostname()))
            new_file_name = os.path.join(export_dir, os.path.basename(export_file))
            if not os.path.isdir(export_dir):
                # create subdirectory
                subprocess.check_call(['sudo', 'mkdir', export_dir])
            # export file
            subprocess.check_call(['sudo', 'cp', export_file, new_file_name])
    except Exception as ex:
        logger.exception(u'appliance.rpc.export_backup.error', cause=ex)
        raise ex
    finally:
        # unmount
        subprocess.check_call(['sudo', 'umount', '-l', local_dir])
我可以通过如下调用自己检查操作是否实际成功或失败:

if not os.path.ismount(local_dir):
    raise Exception('Failed to mount')
运行我的子流程命令后。。。这是可行的,但这似乎是失败的和倒退的

从我读过的所有内容(甚至在pythonshell中进行了测试)来看,如果存在返回代码为非零的调用,check_调用应该会引发CalledProcessError,但由于某些原因,我无法理解它们不会在这里为我触发

我试过的“坏电话”的一个例子是

subprocess.check_call(['sudo', 'mount', '-t', 'cifs', '-o', 'username=somethingbad,password=somethingwrong,domain=thisisrightforsomereason', '//destination/doesnt/exist', '/mnt/export'])
从shell中,这告诉我:“无法解析目标地址:未知错误”,然后向我提供被调用的进程错误回溯。但当我将这些相同的信条加入到我的功能中时,它似乎已经成功了


我做错了什么?

子流程放在您认为应该失败的任何
检查调用()之前检查调用('exit 1',shell=True)
,并用结果更新您的问题。将shell设置为True似乎不起作用。我正在从rpc进程进行这些调用。。。这有区别吗?这不是关于
shell=True
。将代码完全按照我编写的方式放置并报告结果。幸运的是,我能够通过消除我认为在rpc进程中运行它的限制来解决这个问题。当我取出代码并在服务器上运行它时,它就如预期的那样工作了。不幸的是,在重构之后,我不再能够完全按照编写的那样测试您的评论的功能。抱歉@J.F.Sebastian,谢谢你的帮助!将
子流程。在您认为应该失败的任何
检查调用()之前检查调用('exit 1',shell=True)
,并用结果更新您的问题。将shell设置为True似乎不起作用。我正在从rpc进程进行这些调用。。。这有区别吗?这不是关于
shell=True
。将代码完全按照我编写的方式放置并报告结果。幸运的是,我能够通过消除我认为在rpc进程中运行它的限制来解决这个问题。当我取出代码并在服务器上运行它时,它就如预期的那样工作了。不幸的是,在重构之后,我不再能够完全按照编写的那样测试您的评论的功能。抱歉@J.F.Sebastian,谢谢你的帮助!