【问题标题】:Does python's `os.system` ever throw an exception?python的`os.system`会抛出异常吗?
【发布时间】:2011-07-12 05:27:20
【问题描述】:

Python 成名的受人尊敬的os.system 会抛出异常吗?如果有,有哪些?

【问题讨论】:

  • os.system() 已经几乎没有受到尊重了......

标签: python exception command-line exception-handling operating-system


【解决方案1】:

简短回答:是的:

>>> import os
>>> os.system(None)
TypeError ...

长答案:查看此处http://docs.python.org/library/subprocess.html#subprocess-replacements,了解如何避免使用os.system

【讨论】:

  • 我意识到这只是一个例子。我不知道任何其他可能的异常类型; 'wrong' 字符串或 unicode 参数都只是传递给 shell。仍然......最好避免使用 os.system。
【解决方案2】:

在 POSIX 系统上,它似乎是对 system() 的直接传递(来自 Python 2.7.1 的 posixmodule.c):

static PyObject *
posix_system(PyObject *self, PyObject *args)
{
    char *command;
    long sts;
    if (!PyArg_ParseTuple(args, "s:system", &command))
        return NULL;
    Py_BEGIN_ALLOW_THREADS
    sts = system(command);
    Py_END_ALLOW_THREADS
    return PyInt_FromLong(sts);
}

【讨论】:

  • 虽然很有启发性,但这是一个实现细节——除非文档明确指定它会引发或不引发哪些异常,否则没有理由其他实现不能选择在某些条件下引发异常。
  • 这就是为什么人们应该熟悉使用的运行时。我假设是 CPython,因为没有提到更具体的运行时环境(Jython、PyPi)。 2.7.1 的 os.system 文档没有提及应该/可以引发的异常。
【解决方案3】:

os.system 抛出 TypeError 如果不存在恰好一个字符串参数。如果fork 由于资源或ulimit 限制而失败,它将返回-1。如果参数在某些方面无效(如不存在的命令),它将返回一个高错误代码。除了前面提到的TypeErroros.system 不会抛出任何异常。

【讨论】:

    【解决方案4】:

    如果你问的是你调用的进程以错误结束时是否抛出异常,答案是否定的,你可以用os.system()调用一个程序,让它出错,你永远不会知道.

    这就是您应该使用subprocess 模块的原因。

    【讨论】:

      猜你喜欢
      • 2018-03-25
      • 2011-11-02
      • 1970-01-01
      • 2023-03-23
      • 2010-09-26
      • 1970-01-01
      • 2011-12-05
      • 2020-02-24
      • 1970-01-01
      相关资源
      最近更新 更多