• 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);
    }
    

      

  • 相关阅读:
    CNI 这么多,怎么选?| 容器网络系列第 1 期
    FabEdge 成为 CNCF 沙箱级项目
    向 Analysis Services 实例授予服务器管理员权限
    Connecting to Integration Services Access is Denied in SQL Server 2016 or 2017
    How To Convert A CER Certificate To PFX Without The Private Key
    Linux Shell脚本经典案例
    MDK5 HC32F460编译生成BIN文件配置
    MDK5 魔术棒中target中的IROM1与IRAM1
    Mongodb副本集切换主从节点调整优先级
    mongodb 创建用户,设置密码
  • 原文地址:https://www.cnblogs.com/tuzkee/p/16065592.html
Copyright © 2020-2023  润新知