运行 Python 脚本/代码的几种方式
哈喽大家好,我是咸鱼
我们知道,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 脚本/代码的几种方式的更多相关文章
- Java运行Python脚本的几种方式
由于在项目需要执行Python,找寻相关资料,总结出以下几种方式: 直接执行Python脚本代码 引用 org.python包 PythonInterpreter interpreter = new ...
- 命令行运行Python脚本时传入参数的三种方式
原文链接:命令行运行Python脚本时传入参数的三种方式(原文的几处错误在此已纠正) 如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式. pyth ...
- 转-Pycharm中运行Python代码的几种方式
转自:Pycharm中运行Python代码的几种方式 在pycharm中的Python代码运行会出现各种奇葩的问题,比如,密码输入时不显示或没有提示,给我们带来一些麻烦,下面介绍几种代码运行的几种方式 ...
- 如何在Windows下开发Python:在cmd下运行Python脚本+如何使用Python Shell(command line模式和GUI模式)+如何使用Python IDE
http://www.crifan.com/how_to_do_python_development_under_windows_environment/ 本文目的 希望对于,如何在Windows下, ...
- 最全总结!聊聊 Python 调用 JS 的几种方式
1. 前言 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大 ...
- Python 配置日志的几种方式
Python配置日志的几种方式 作为开发者,我们可以通过以下3种方式来配置logging: (1)使用Python代码显式的创建loggers,handlers和formatters并分别调用它们的配 ...
- Python 拼接字符串的几种方式
在学习Python(3x)的过程中,在拼接字符串的时候遇到了些问题,所以抽点时间整理一下Python 拼接字符串的几种方式. 方式1,使用加号(+)连接,使用加号连接各个变量或者元素必须是字符串类型( ...
- Python实现定时执行任务的三种方式简单示例
本文实例讲述了Python实现定时执行任务的三种方式.分享给大家供大家参考,具体如下: 1.定时任务代码 import time,os,sched schedule = sched.scheduler ...
- 横向对比分析Python解析XML的四种方式
横向对比分析Python解析XML的四种方式 在最初学习PYTHON的时候,只知道有DOM和SAX两种解析方法,但是其效率都不够理想,由于需要处理的文件数量太大,这两种方式耗时太高无法接受. 在网络搜 ...
- 【Shell脚本】运行shell脚本文件的几种方法与区别
Shell脚本不同的运行方式会对当前Shell设置或者运行结果有所不同. 假设现在有一个脚本名为display_shell_script_args.sh,其内容如下: #!/home/pyf/bin/ ...
随机推荐
- 特性介绍 | MySQL测试框架 MTR 系列教程(四):语法篇
作者:卢文双 资深数据库内核研发 序言: 以前对 MySQL 测试框架 MTR 的使用,主要集中于 SQL 正确性验证.近期由于工作需要,深入了解了 MTR 的方方面面,发现 MTR 的能力不仅限于此 ...
- 兰姆达 x AnayticDB 降本30%的数据湖最佳实践
1. 客户介绍 上海兰姆达数据科技有限公司(简称"兰姆达数据")是一家提供卓越的数据科学软件产品和解决方案的初创高科技公司.兰姆达核心团队专注于大数据,机器学习算法和精准营销Saa ...
- Android 自定义view中根据状态修改drawable图片
原文地址:Android 自定义view中根据状态修改drawable图片 - Stars-One的杂货小窝 本文涉及知识点: Android里的selector图片使用 底部导航栏的使用 自定义vi ...
- 如何构建高效、可观的系统「GitHub 热点速览」
经典老项目 system-design 教你如何设计一个健壮的系统,新项目 noodle 教你如何提升教育效率,而后者甚至单日获得了 1,600 star,刚开源就获得了 6k+ 的 star. 除了 ...
- switch写法详解
我们在开发项目中经常遇到对数据的判断进行相应的逻辑(if..else ,三元运算等),Switch 语句用来选择多个需要执行的代码块 ,一定程度上简化了if....else 1. 语法 switch ...
- 线程池shutdown引发TimeoutException
问题描述 分享一个发版过程服务报错问题,问题出现在每次发版,服务准备下线的时候,报错的位置是在将任务submit提交给线程池,使用Future.get()引发的TimeoutException,错误日 ...
- TCP超时分析
参考链接: Linux 建立 TCP 连接的超时时间分析 Linux 建立 TCP 连接的超时时间分析 Linux 系统默认的建立 TCP 连接的超时时间为 127 秒. 2 分 7 秒即 127 秒 ...
- 长连接:chatgpt流式响应背后的逻辑
一.前言: 提起长连接,我们并不陌生,最常见的长连接非websocket莫属了.即使没有在项目中实际用过,至少也应该有所接触.长连接指在一次网络通信中,客户端与服务器之间建立一条持久的连接,可以在多次 ...
- SpringBoot3文件管理
目录 一.简介 二.工程搭建 1.工程结构 2.依赖管理 三.上传下载 1.配置管理 2.上传下载 四.Excel文件 1.Excel创建 2.Excel读取 3.解析监听 4.导入导出 五.参考源码 ...
- 调研capacitor兼容openharmony平台可行性
团队可能需要对开源的 capacitor 跨平台框架进行扩展,以生产支持 OpenHarmony 平台的应用,在此调研可行性.实现路径和预期工作量. 可行性分析 在验证 capacitor 是否可以将 ...