哈喽大家好,我是咸鱼

我们知道,python 脚本或者说 python 程序其实是一个包含了 python 代码的文件。要让它们实现特定功能,我们需要知道该如何运行(run)它

通过运行 python 代码,我们可以验证脚本/程序是否按照我们的期望执行。这也使我们能够对其进行测试和调试,以便找到并修复潜在的 bug

在 python 中,有多种方式来运行脚本或程序,取决于小伙伴们的需求和偏好,毕竟萝卜青菜各有所爱

接下来,咸鱼将介绍几种常见的 python 代码运行方式

原文:https://realpython.com/run-python-scripts/

脚本和模块

在计算机术语中,脚本(scripts)是指一个包含逻辑顺序的文本文件,我们可以运行脚本来完成特定任务

这些逻辑顺序通常用脚本语言(scripting language)表示,脚本语言是一种编程语言,允许我们操作、定制或自动化任务

脚本语言通常在运行时(runtime)解释,而不是在编译(compiled)时。所以脚本通常由某种解释器运行,解释器的工作就是按顺序执行脚本中的代码

python 就是一门解释型语言。一般来讲 python 代码被称为脚本(或者在更复杂的应用程序中称为入口点脚本)

另一方面,包含 python 代码的文件(例如 A.py )可以被另一个 python 文件(例如 B.py )导入和使用,这种文件(A.py )就被称为模块(module)

模块和脚本的主要区别在于——模块存储可导入(Importable )的代码,脚本存储可执行(executable )的代码

可导入代码是定义了某些内容但不执行特点操作的代码(例如函数或类的定义)

可执行代码是执行某些特定操作的代码(例如函数的调用、循环、条件判断等)

命令行运行

在 python 编程中,我们可以以纯文本文件来编写 python 程序。需要注意的是,包含 python 代码的文件用 .py 做后缀名

首先我们创建一个 python 脚本 hello.py

# hello.py

print("Hello, World!")
  • 使用 python 命令

以 Windows 为例,我们需要打开 Windows 终端(win + R 然后输入 cmd),然后敲入下面的命令

# 相对路径
>>> python .\hello.py
Hello, World! >>> py .\hello.py
Hello, World! # 绝对路径
>>> python D:\python\hello.py
Hello, World! >>> py D:\python\hello.py
Hello, World!

在 Windows 中,我们还可以使用 py 命令,这个命令会触发控制台应用程序的 py.exe 启动器

在某些 Linux 发行版中,可能需要使用 python3 命令,而不是简单的 python

终端或 shell 运行 python 脚本还有一个很酷的功能就是:可以使用重定向将 python 执行结果输出到某个文件中,方便我们将结果保存下来并对其分析

>>> python D:\python\hello.py > D:\python\output.txt

在上面的命令中,> 表示将输出(即 python 脚本的执行结果 hello world!) 重定向到 output.txt 文件中,而不是标准输出到屏幕中

如果 output.txt 不存在,系统会自动创建它,如果存在:

  • > :覆盖

  • >> :追加

  • 直接使用脚本的文件名

以 Windows 为例,我们可以直接使用脚本的文件名来执行脚本

# 绝对路径
>>> D:\python\hello.py # 相对路径
>>> .\hello.py

如果是 Linux,需要先给脚本赋可执行权限,否则很有可能报【没有权限】的错误

chmod +x hello.py

赋权之后,hello.py 将可执行,但是还不一定能够正常运行



为什么会有这个报错,是因为操作系统不知道使用哪个程序去执行这个脚本,并尝试使用 shell 去运行它

所以我们需要在脚本中添加一个 shebang 行

[root@localhost ~]# vim /hello.py
#!/usr/bin/env python3 print("Hello, World!")

关于什么是 shebang 行,请看我这篇文章:关于 Bash 脚本中 Shebang 的趣事

添加 shebang 行之后,运行

  • 使用 -m 选项运行 python 模块
# 语法
python -m <module-name>

-m 会在 python 的模块搜索路径、sys.path 中搜索模块名称并运行对应内容

# Linux 为例
# 执行命令的时候最好跟 hello.py 在同一层级目录中
[root@localhost ~]# python -m hello

上面的例子中,把 hello.py 文件作为模块来运行。需要注意的是,<module-name> 是模块的名称,而不是文件名(即不包含 .py 后缀)

交互式运行

前面我们知道,python 是一门解释型语言,执行 python 脚本的时候解释器会按顺序把 python 代码解释成机器语言

所以我们可以通过解释器以交互方式运行代码

严谨点来讲,python 这个名字指的是一个叫做解释器的软件

  • python 解释器

解释器是在你的程序和计算机硬件之间工作的一层软件,能够使你的代码运行

根据你使用的python实现,解释器可以是一个用以下代码编写的程序:

  • C:像 Cpython,是最常用的一种实现
  • python 本身:如PyPy,它是一个带有即时(JIT)编译器的快速实现
  • java:Jython,可以利用 Java 生态

想了解更多 python 实现的原理以及其他 python 实现,可以看我这篇文章:Cpython, Pypy, MicroPython...还在傻傻分不清楚?

无论使用哪种解释器,我们编写的代码都将在上面运行,所以能够运行脚本和代码的第一个条件就是正确安装解释器

python 解释器可以在两种不同的模式下运行代码:

  • 脚本或程序
  • 交互式或 REPL(Read-Eval-Print Loop)

在脚本模式下,我们可以使用解释器将源文件(.py)作为可执行程序去运行;交互模式是你启动解释器并使用它作为一个平台来运行你直接输入的代码

  • python 的 REPL 运行代码

REPL(Read Eval Print Loop)。它表示一个循环中,在这个循环中不断的执行:

  • Read,读取用户输入
  • Eval, 执行输入内容
  • Print,打印输出结果
  • Loop, 不断循环以上步骤
Read -> Eval -> Print -> Read -> Eval
-> Print -> Read -> Eval -> Print -> ...

交互式会话是用于运行 python 代码的广泛使用的工具。若要启动 python 交互式会话 (REPL),请打开命令行窗口,键入 python 命令

交互模式的标准主提示符由三个右尖括号 >>>,以 Windows 为例



Linux 系统



标准 REPL 还具有由三个句点 ( ) 组成的辅助提示符 ... 。在复合语句(如条件、函数和类定义以及循环)添加缩进行时,会出现此提示

>>> for i in range(0,10):
... print(i)

一旦启动了 REPL 会话,就可以按照自己的意愿编写和运行 python 代码。唯一的缺点是:当关闭会话时,代码将消失

这是脚本模式和交互模式之间的一个区别——脚本是持久的

我们以交互方式执行 python 代码时,python 会立即计算并执行每个表达式和语句

从 python 代码中运行

  • import 语句

当我们从另一个模块、脚本或交互式会话导入模块时,python 会加载其中的内容供以后访问和使用

如果被导入模块只有类、函数、变量常量的定义时,我们往往不会意识到代码其实已经运行了,如果被导入模块里面有生成可见结果的函数、方法或其他语句的调用时,我们就能看到在导入的时候已经执行了

>>> import hello
Hello, World!

多次执行 import 语句我们可以发现:每个会话只会运行一次模块中的代码



首次导入模块之后,后面我们即使修改了模块的内容,连续导入也不会执行任何操作,这是因为 import 操作成本很高,python 会采取一些额外的措施来优化整体性能

对于上面的例子,python 知道 hello 模块已经导入。因此,python 会跳过下面的重复导入语句

  • importlib

importlib 是 python 标准库中的一个模块,我们可以通过importlib 以编程的方式导入模块

使用 import_module() ,可以模拟 import 操作,从而执行任何模块或脚本

>>> import importlib
>>> importlib.import_module("hello")
Hello, World!
<module 'hello' from '/root/hello.py'>

import_module()函数导入一个模块,把模块名字放到当前的命名空间中。它还运行目标模块包含的任何可执行代码。这就是为什么你会得到 Hello, World! 在你的屏幕上

前面我们提到过,导入的时候 python 只会执行一次模块中的代码,之后的导入是不会执行的

如果你想重新加载模块并再次运行其中的代码,可以使用 reload() 函数,它会强制解释器再次导入

>>> import hello
Hello World! >>> import importlib
>>> importlib.reload(hello)
Hello World!
<module 'hello' from '/root/hello.py'>
  • exec() 函数

除此之外,我们还可以使用内置 exec() 函数来执行

>>> with open("hello.py") as hello:
... exec(hello.read())
...
Hello, World!

我们首先打开 hello.py 文件,然后读取文件内容,再把内容传递给 exec() 函数

IDE / 代码编辑器运行

为了开发大型和复杂的应用程序,我们应该使用集成开发环境(IDE)或高级文本编辑器

这些程序中的大多数都有一些选项,允许我们在环境本身内部运行程序。它们通常包含 Run 或 Build 操作,这通常可以从工具栏或主菜单中获得。

运行 Python 脚本/代码的几种方式的更多相关文章

  1. Java运行Python脚本的几种方式

    由于在项目需要执行Python,找寻相关资料,总结出以下几种方式: 直接执行Python脚本代码 引用 org.python包 PythonInterpreter interpreter = new ...

  2. 命令行运行Python脚本时传入参数的三种方式

    原文链接:命令行运行Python脚本时传入参数的三种方式(原文的几处错误在此已纠正) 如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式. pyth ...

  3. 转-Pycharm中运行Python代码的几种方式

    转自:Pycharm中运行Python代码的几种方式 在pycharm中的Python代码运行会出现各种奇葩的问题,比如,密码输入时不显示或没有提示,给我们带来一些麻烦,下面介绍几种代码运行的几种方式 ...

  4. 如何在Windows下开发Python:在cmd下运行Python脚本+如何使用Python Shell(command line模式和GUI模式)+如何使用Python IDE

    http://www.crifan.com/how_to_do_python_development_under_windows_environment/ 本文目的 希望对于,如何在Windows下, ...

  5. 最全总结!聊聊 Python 调用 JS 的几种方式

    1. 前言 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大 ...

  6. Python 配置日志的几种方式

    Python配置日志的几种方式 作为开发者,我们可以通过以下3种方式来配置logging: (1)使用Python代码显式的创建loggers,handlers和formatters并分别调用它们的配 ...

  7. Python 拼接字符串的几种方式

    在学习Python(3x)的过程中,在拼接字符串的时候遇到了些问题,所以抽点时间整理一下Python 拼接字符串的几种方式. 方式1,使用加号(+)连接,使用加号连接各个变量或者元素必须是字符串类型( ...

  8. Python实现定时执行任务的三种方式简单示例

    本文实例讲述了Python实现定时执行任务的三种方式.分享给大家供大家参考,具体如下: 1.定时任务代码 import time,os,sched schedule = sched.scheduler ...

  9. 横向对比分析Python解析XML的四种方式

    横向对比分析Python解析XML的四种方式 在最初学习PYTHON的时候,只知道有DOM和SAX两种解析方法,但是其效率都不够理想,由于需要处理的文件数量太大,这两种方式耗时太高无法接受. 在网络搜 ...

  10. 【Shell脚本】运行shell脚本文件的几种方法与区别

    Shell脚本不同的运行方式会对当前Shell设置或者运行结果有所不同. 假设现在有一个脚本名为display_shell_script_args.sh,其内容如下: #!/home/pyf/bin/ ...

随机推荐

  1. 我用numpy实现了VIT,手写vision transformer, 可在树莓派上运行,在hugging face上训练模型保存参数成numpy格式,纯numpy实现

    先复制一点知乎上的内容 按照上面的流程图,一个ViT block可以分为以下几个步骤 (1) patch embedding:例如输入图片大小为224x224,将图片分为固定大小的patch,patc ...

  2. 安装Hadoop单节点伪分布式集群

    目录 安装Hadoop单节点伪分布式集群 系统准备 开启SSH 安装JDK 安装Hadoop 下载 准备启动 伪分布式模式安装 配置 配饰SSH免密登录本机 测试启动 单节点安装YARN 伪分布式集群 ...

  3. List子集合__小记

    List集合的子实现类的特点: ArrayList: 底层数据结构是数组的形式,满足数组结构的特点:查询快,增删慢 从线程安全问题来看:线程不安全的,不同步,执行效率高 Vector: 底层数据结构是 ...

  4. MiniNK WEB 选拔题 by F12

    Start 除了梦想外一无所有的我们,将会和蔑视与困境做最后的斗争,这是最后一舞 N0wayBack 联合战队成立以来一直致力于信息安全技术的研究,作为联合战队活跃在各大 CTF (信息安全竞赛)赛事 ...

  5. Git子模块使用说明

    介绍 前端不同应用存在公共的脚本或样式代码,为了避免重复开发,将公共的代码抽取出来,形成一个公共的 git 子模块,方便调用和维护. 软件架构 本仓库代码将作为 git 子模块,被引用到其他仓库中,不 ...

  6. Windows安装hexo并配置nginx

    前言 Hexo是一款基于NodeJS的静态博客框架,依赖少且易于安装使用,可以方便地生成静态网页. 本文记录Windows安装hexo,配置第三方主题Fluid,并配置nginx的全过程. nodej ...

  7. Ubuntu20.04 下编译和运行 FreeSWITCH的问题汇总

    1. Ubuntu20.04 下编译和运行 FreeSWITCH的问题汇总 1.1. 环境 Ubuntu20.04.2 LTS (Linux 5.4.0-152-generic x86_64 GNU/ ...

  8. 操作系统实验——利用Linux的消息队列通信机制实现两个线程间的通信

    目录 一. 题目描述 二.实验思路 三.代码及实验结果 四.遇到问题及解决方法 五.参考文献 一. 题目描述 编写程序创建三个线程:sender1线程.sender2线程和receive线程,三个线程 ...

  9. SpringBoot3集成RocketMq

    标签:RocketMq5.Dashboard: 一.简介 RocketMQ因其架构简单.业务功能丰富.具备极强可扩展性等特点被广泛应用,比如金融业务.互联网.大数据.物联网等领域的业务场景: 二.环境 ...

  10. VScode软件的安装以及C/C++环境配置的方法

    今天和大家分享一下VScode软件的安装以及C/C++环境配置的方法.手把手教大家入门. 1,下载VScode编译器 (1)    官网下载链接:https://code.visualstudio.c ...