Python 捕捉;“拒绝访问”;使用subprocess.call设置环境变量时出错

Python 捕捉;“拒绝访问”;使用subprocess.call设置环境变量时出错,python,python-2.7,subprocess,method-call,Python,Python 2.7,Subprocess,Method Call,我试图设置一个环境变量,但由于访问被拒绝而失败,然而,try-except块没有将此作为错误捕获。我可以自己捕获退出代码,然后检查退出代码是否与0不同,但我希望有一种更类似python的方法 这是我尝试过的,因此执行: try: exit_code = subprocess.call(["SETX", "-m", "ENV_VAR", "Test"]) print 'exit_code: {}'.format(exit_code) # for debugging purpose

我试图设置一个环境变量,但由于访问被拒绝而失败,然而,try-except块没有将此作为错误捕获。我可以自己捕获退出代码,然后检查退出代码是否与0不同,但我希望有一种更类似python的方法

这是我尝试过的,因此执行:

try:
    exit_code = subprocess.call(["SETX", "-m", "ENV_VAR", "Test"])
    print 'exit_code: {}'.format(exit_code)  # for debugging purposes
except Exception:
    raise Exception("Could not set environment variable")
结果是:

ERROR: Access to the registry path is denied.
exit_code: 1

Process finished with exit code 0
如您所见,subprocess.call返回的退出代码为1,表示失败,但是,整个Python进程正在退出,退出代码为0,并且从未调用“raiseexception”

最好的解决方法是什么?

感谢您指出正确的用法。固定代码:

try:
    subprocess.check_call(["SETX", "-m", "ENV_VAR", "Test"])
except subprocess.CalledProcessError:
    raise Exception("Could not set environment variable")

值得一提的是:我知道使用“例外情况除外”是不好的做法,但这只是一个例子来说明我所面临的问题,由于我无法确定在这种情况下从subprocess.call引发的错误/异常的确切类型。您应该改用subprocess.check_调用或subprocess.check_输出并处理被调用的进程错误异常。链接:@AlexK。很好,正是我需要的。非常感谢你!我建议您在所有情况下,都应该出现与您得到的错误相同的错误,这样您就可以看到实际的错误消息,而不是“无法设置环境变量”。或者至少打印/记录/写在某个地方-这样可以在调试时节省一些时间。