【问题标题】:Catching "Access denied" error when setting an environment variable using subprocess.call使用 subprocess.call 设置环境变量时捕获“拒绝访问”错误
【发布时间】:2018-06-26 13:20:09
【问题描述】:

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

这是我尝试过的执行:

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 退出,并且从未调用过“引发异常”。

最好的解决方法是什么?

【问题讨论】:

  • 值得一提:我知道使用“except Exception”是不好的做法,但这只是显示我面临的问题的一个例子,因为我无法确定错误的确切类型/在这种情况下从 subprocess.call 引发的异常。
  • 您应该改用 subprocess.check_call 或 subprocess.check_output 并处理 CalledProcessError 异常。链接:docs.python.org/2/library/subprocess.html#
  • @AlexK。完美,正是我需要的。非常感谢!

标签: python python-2.7 subprocess method-call


【解决方案1】:

感谢Alex K. 指出正确的用法。固定代码:

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

【讨论】:

  • 我建议您出现与您得到的相同的错误,以便在所有情况下都可以看到实际的错误消息而不是“无法设置环境变量”。或者至少在某处打印/记录/写入 - 它可以在调试时节省一些时间。
猜你喜欢
  • 2021-04-08
  • 1970-01-01
  • 2012-07-06
  • 2014-12-03
  • 2020-11-18
  • 2012-05-21
  • 2022-06-13
  • 2014-10-04
  • 2014-12-05
相关资源
最近更新 更多