Python中“inspect”和“interactive”命令行标志的区别

7 投票
2 回答
5628 浏览
提问于 2025-04-15 12:59

“inspect”和“interactive”这两个标志有什么区别呢?sys.flags函数可以打印出这两个标志的值。

根据sys.flags的文档,它们怎么都可以有“-i”这个标志呢?

我怎么才能单独设置这两个标志?如果我使用“python -i”,这两个标志的值都会变成1。

相关内容:

2 个回答

0

man python-i 这个选项的说明是:

当你把一个脚本作为第一个参数传入,或者使用了 -c 选项后,执行完脚本或命令后会进入交互模式。这个模式不会读取 $PYTHONSTARTUP 文件。这个功能在脚本出现错误时,可以帮助你查看全局变量或错误堆栈信息。

所以 -i 让你可以在 交互 模式下对脚本进行 检查-i 包含 这两种功能。你可以在不检查的情况下进入交互模式(比如只输入 python,不带参数),但反过来就不行。

9

根据pythonrun.c的内容,Py_InspectFlagPy_InteractiveFlag的用法如下:

int Py_InspectFlag; /* Needed to determine whether to exit at SystemError */
/* snip */
static void
handle_system_exit(void)
{
    PyObject *exception, *value, *tb;
    int exitcode = 0;

    if (Py_InspectFlag)
        /* Don't exit if -i flag was given. This flag is set to 0
         * when entering interactive mode for inspecting. */
        return;
    /* snip */
}

如果“inspect”标志为真,Python在遇到SystemExit时不会退出。

int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
/* snip */
/*
 * The file descriptor fd is considered ``interactive'' if either
 *   a) isatty(fd) is TRUE, or
 *   b) the -i flag was given, and the filename associated with
 *      the descriptor is NULL or "<stdin>" or "???".
 */
int
Py_FdIsInteractive(FILE *fp, const char *filename)
{
    if (isatty((int)fileno(fp)))
        return 1;
    if (!Py_InteractiveFlag)
        return 0;
    return (filename == NULL) ||
           (strcmp(filename, "<stdin>") == 0) ||
           (strcmp(filename, "???") == 0);
}

如果“interactive”标志为假,并且当前输入没有和终端关联,那么Python就不会进入“交互”模式(比如不刷新输出、不打印版本信息、不显示提示符等等)。

-i选项会同时开启这两个标志。如果PYTHONINSPECT环境变量不为空,那么“inspect”标志也会被开启(具体可以查看main.c)。

简单来说,如果你设置了PYTHONINSPECT变量并运行你的模块,那么在遇到SystemExit时,Python不会退出(比如在脚本结束时),而是会给你一个交互式的提示符,这样你就可以查看你的模块状态(所以这个标志叫“inspect”)。

撰写回答