Python怎么直接运行txt文件中的代码
详细讲解Python如何直接运行txt文件中的代码,涵盖终端直接调用、runpy模块加载、exec函数动态解析及标准输入重定向等方法与避坑要点。
.py。只要文件保存的是合法的 Python 纯文本字符序列,无论是在操作系统的终端命令行中直接指定文件名执行,还是在已有的 Python 程序中通过标准库或内置动态执行接口调用,都可以无障碍直接运行 .txt 文件中的代码。
方法一:在系统终端命令行中直接运行 txt 文件
初学 Python 时,绝大多数人习惯使用 python main.py 命令来执行程序,这容易让人误以为解释器只认 .py 文件。事实上,Python 命令行工具的设计逻辑非常直接:它接收一个文件路径参数后,会打开该文件读取内容,将其作为源代码文本流送入编译器构建抽象语法树(AST),随后生成字节码并在虚拟机中执行。解释器本身并不会拦截或拒绝 .txt 扩展名。
1. 编写示例文本文件
在项目工作目录下新建一个名为 script.txt 的普通文本文件,使用任何文本编辑器输入以下标准的 Python 代码并保存:
# 文件名: script.txt
import sys
print("正在运行 txt 文件中的代码...")
data_list = [10, 20, 30, 40, 50]
total = sum(data_list)
average = total / len(data_list)
print(f"数据总和: {total}")
print(f"平均数值: {average}")
print(f"当前使用的解释器路径: {sys.executable}")
2. 终端执行命令与结果
打开系统的终端(Windows 下为 PowerShell 或 CMD,macOS / Linux 下为 Terminal),切换到该文件所在的目录,直接将 script.txt 作为参数传递给 Python:
python script.txt
如果使用的是特定版本环境,也可以使用对应的别名命令:
python3 script.txt
终端中会立即打印出计算结果与输出信息:
[输出示例]
正在运行 txt 文件中的代码...
数据总和: 150
平均数值: 30.0
当前使用的解释器路径: /usr/local/bin/python3
方法二:在 Python 代码中使用 runpy 模块运行
如果在现有的 Python 程序内部想要加载并运行一个外部的 .txt 脚本,直接使用 import script.txt 是行不通的。因为 Python 的 import 机制遵循特定的模块查找规范,系统只会主动扫描 .py、.pyc、.so(C扩展)等指定后缀,遇到带有小圆点的文件名还会将其解析为包层级目录。
对于这种需要“在代码内执行外部非 py 脚本”的场景,Python 标准库提供了内置的 runpy 模块。该模块的 run_path() 函数能够像终端运行脚本一样定位并执行任意路径的文本文件,同时将该文件内部生成的所有全局变量以字典形式返回给当前程序。
代码示例:使用 runpy.run_path
import runpy
# 执行当前目录下的 txt 文本脚本
# run_path 会执行该文件内的所有顶层语句
file_globals = runpy.run_path("script.txt")
# 获取脚本执行后产生的变量结果
print("外部 txt 脚本执行完成!")
print("从 txt 中获取的 total 变量值:", file_globals.get("total"))
print("从 txt 中获取的 average 变量值:", file_globals.get("average"))
runpy.run_path() 在执行时会为被调用的 .txt 文件构建一个崭新的模块命名空间,其内部的 __name__ 会被设置为 "<run_path>"(也可以通过参数指定为 "__main__"),因此非常适合用来做插件调度与外部任务分发。
方法三:使用内置函数 exec() 动态解析与求值
如果除了运行文件之外,还希望对文本内容进行预处理(例如替换关键字、动态注入变量、或者只执行文件中的某些段落),Python 内置的 exec() 函数是最灵活的选择。
基本思路分为两步:首先使用 Python 内置的 open() 函数读取 .txt 文件的全部文本内容,然后将其传递给 exec() 动态编译执行。
1. 基础读取与执行代码
# 打开并读取 txt 文件的所有代码字符
with open("script.txt", "r", encoding="utf-8") as f:
source_code = f.read()
# 执行代码
exec(source_code)
2. 规范做法:隔离全局与局部命名空间
直接调用 exec(source_code) 会将文本中的变量直接写入当前函数的局部或全局作用域中,这可能导致原有同名变量被意外覆盖。在实际项目中,强烈建议传入独立的字典进行命名空间隔离:
# 准备独立的沙箱字典
custom_globals = {"__builtins__": __builtins__}
custom_locals = {}
with open("script.txt", "r", encoding="utf-8") as f:
source_code = f.read()
# 将执行作用域限定在自定义字典中
exec(source_code, custom_globals, custom_locals)
# 从独立字典中安全读取变量
if "total" in custom_locals:
print("安全捕获计算值:", custom_locals["total"])
elif "total" in custom_globals:
print("安全捕获全局值:", custom_globals["total"])
exec() 拥有完整的系统执行权限。绝对不要使用 exec() 直接执行来源未知、用户上传或不可信网络接口返回的 .txt 文件,否则可能会遭受任意代码执行攻击(如删除本地文件或运行恶意后门)。
方法四:通过操作系统管道与标准输入重定向
在自动化构建、容器初始化(Docker)或者 Linux / macOS 的 Shell 运维脚本中,有时我们既不希望运行一个新写的宿主 Python 脚本,也不希望给解释器显式传递文件名参数。此时可以利用操作系统的输入流重定向功能。
1. 标准输入重定向(< 操作符)
python < script.txt
此时,操作系统 Shell 会将 script.txt 打开并将其文件描述符连接到 Python 进程的标准输入(sys.stdin)。Python 解释器在没有收到文件名参数时,会默认从标准输入读取代码并逐行解析运行。
2. 管道传递(Pipeline)
在 Linux / macOS 或类 Unix 环境下,可以使用 cat 命令结合管道将文本流输送给 Python:
cat script.txt | python
这种方式的特点是 Python 进程内部的 __file__ 属性通常为未定义或为 <stdin>,非常适合那些单次消费、执行后即焚的自动化轻量任务。
操作细节与常见避坑指南
虽然直接运行 .txt 文件在技术上没有障碍,但在实际生产或跨平台操作中,经常会遇到几个典型问题:
1. 文件编码不一致导致 SyntaxError
在 Windows 系统下,很多文本编辑软件(如默认的记事本)保存 .txt 时可能会使用 ANSI(GBK)编码。当代码中含有中文字符或注释时,Python 3 默认以 UTF-8 读取源码,此时会抛出形如 SyntaxError: Non-UTF-8 code starting with... 的报错。因此,在保存 .txt 文件时,务必在编辑器中明确指定编码格式为 UTF-8。
2. 相对路径与当前工作目录差异
如果 .txt 文件内部包含读取外部文件的代码(例如 open("data.csv")):
- 使用
python path/to/script.txt运行时,Python 的当前工作目录(CWD)是终端发起命令时的路径,而不是script.txt所在的目录。 - 如果使用
exec()动态调用,由于代码是在宿主环境中运行,其相对路径将完全跟随宿主程序的工作目录。
3. txt 文件之间相互引用时的限制
如果主代码保存在 main.txt 中,辅助模块保存在 helper.txt 中,在 main.txt 内部写 import helper 是无法成功的。因为 Python 的导入系统根据名称搜索模块时,根本不会去匹配 .txt 文件。对于相互依赖的复杂工程项目,应当规范采用 .py 扩展名;如果必须依赖文本文件,应改用 runpy.run_path() 显式调用并获取导出对象。
总结
Python 解释器关注的是内容本身的语法结构,而不是操作系统的扩展名后缀。在实际开发和自动化场景中:
- 如果只是想在控制台快速验证或单次运行,直接执行
python script.txt是最省心直接的途径; - 如果是在其他 Python 程序中需要动态调用文本文件中的功能,标准库的
runpy.run_path()提供了最规范的模块级命名空间隔离与结果返回机制; - 如果需要动态修改字符串或严格限制执行环境,可以使用
exec()配合沙箱字典; - 在 Shell 自动化流水线中,
python < script.txt则是无缝衔接管道命令的利器。
只要确保文件采用标准的 UTF-8 编码,并注意规避跨文件的 import 限制,就能够安全、稳定地在各类场景中运行 .txt 文本中的 Python 代码。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













