1. 程式人生 > 其它 >Python指令碼的不同執行方式

Python指令碼的不同執行方式

 

Python直譯器啟動流程:main -> Py_BytesMain -> pymain_main -> Py_RunMain -> pymain_run_python

 

pymain_run_command:以python -c "import os;os.system('pause')"的方式執行一行python指令碼
pymain_run_module:以python -m http.server的方式執行一個Python模組。另外還要一種不用-m的方式,python http.server,也是呼叫pymain_run_module,區別就在於這種方式會找package下的__main__.py執行,而python -m的方式會先執行__init__.py,再執行__main__.py
pymain_run_file:python xxx.py的方式執行
pymain_run_stdin:python命令開啟命令互動,然後讀取使用者輸入執行
pymain_repl:以-i引數(python -i xxx.py)執行時,在指令碼執行完成後,會進入到互動模式而不退出Python直譯器

 

static void
pymain_run_python(int *exitcode)
{
    // 略。。。

    if (config->run_command) {
        // 以 python -c "print('123')" 的方式執行
        *exitcode = pymain_run_command(config->run_command);
    }
    else if (config->run_module) {
        // 以 python -m http.server 的方式執行
        *exitcode = pymain_run_module(config->run_module, 1);
    }
    else if (main_importer_path != NULL) {
        // 以 python http.server 的方式執行
        // 與 python -m http.server 的區別在於,會先執行__init__.py,再執行__main__.py
        // 而 python http.server 只會執行__main__.py
        *exitcode = pymain_run_module(L"__main__", 0);
    }
    else if (config->run_filename != NULL) {
        // 以 python xxx.py 的方式執行
        *exitcode = pymain_run_file(config);
    }
    else {
        // 直接執行python命令,然後以互動模式執行使用者輸入
        *exitcode = pymain_run_stdin(config);
    }

    // 所有上面的4種模式,都可以再增加一個-i的引數,比如 python -i xxx.py
    // 這樣上面的流程執行完成後,Python直譯器並不會退出,而是開啟互動模式繼續執行
    pymain_repl(config, exitcode);
    goto done;

error:
    *exitcode = pymain_exit_err_print();

done:
    Py_XDECREF(main_importer_path);
}