Python指令碼的不同執行方式
阿新 • • 發佈:2022-03-28
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); }