|涨见识了,在终端执行 Python 代码的 6 种方式


|涨见识了,在终端执行 Python 代码的 6 种方式
本文插图
|涨见识了,在终端执行 Python 代码的 6 种方式
本文插图

作者 | BRETT CANNON
译者 | 豌豆花下猫@Python猫
为了我们推出的 VS Code 的 Python 插件[1] , 我写了一个简单的脚本来生成变更日志[2](类似于Towncrier[3] , 但简单些 , 支持 Markdown , 符合我们的需求) 。 在发布过程中 , 有一个步骤是运行python news , 它会将 Python 指向我们代码中的''news''目录 。
前几天 , 一位合作者问这是如何工作的 , 似乎我们团队中的每个人都知道如何使用-m?请参阅我的有关带 -m 使用 pip 的文章[4] , 了解原因 。
这使我意识到其他人可能不知道有五花八门的方法可以将 Python 指向要执行的代码 , 因此有了这篇文章 。
|涨见识了,在终端执行 Python 代码的 6 种方式
本文插图

通过标准输入和管理
因为如何用管道传东西给一个进程是属于 shell 的内容 , 我不打算深入解释 。 毋庸置疑 , 你可以将代码传递到 Python 中 。
# 管道传内容给 python
echo ''print('hi')'' | python
如果将文件重定向到 Python , 这显然也可以 。
# 重定向一个文件给 python
python < spam.py
归功于 Python 的 UNIX 传统 , 这些都不太令人感到意外 。
|涨见识了,在终端执行 Python 代码的 6 种方式
本文插图

通过 -c 指定的字符串
如果你只需要快速地检查某些内容 , 则可以在命令行中将代码作为字符串传递 。
# 使用 python 的 -c 参数
python -c ''print('hi')''
当需要检查仅一行或两行代码时 , 我个人会使用它 , 而不是启动 REPL(译注:Read Eval Print Loop , 即交互式解释器 , 例如在 windows 控制台中输入python ,就会进入交互式解释器 。 -c 参数用法可以省去进入解释器界面的过程)
|涨见识了,在终端执行 Python 代码的 6 种方式
本文插图

文件的路径
最众所周知的传代码给 python 的方法很可能是通过文件路径 。
# 指定 python 的文件路径
python spam.py
要实现这一点的关键是将包含该文件的目录放到sys.path里 。 这样你的所有导入都可以继续使用 。 但这也是为什么你不能/不应该传入包含在一个包里的模块路径 。 因为sys.path可能不包含该包的目录 , 因此所有的导入将相对于与你预期的包不同的目录 。
|涨见识了,在终端执行 Python 代码的 6 种方式
本文插图

对包使用 -m
执行 Python 包的正确方法是使用 -m 并指定要运行的包名 。
python -m spam
它在底层使用了runpy[5] 。 要在你的项目中做到这点 , 只需要在包里指定一个__main__.py文件 , 它将被当成__main__执行 。 而且子模块可以像任何其它模块一样导入 , 因此你可以对其进行各种测试 。
我知道有些人喜欢在一个包里写一个main子模块 , 然后将其__main__.py写成:
from . import main
if __name__ == ''__main__'':
main.main
就我个人而言 , 我不感冒于单独的main模块 , 而是直接将所有相关的代码放入__main__.py , 因为我感觉这些模块名是多余的 。
(译注:即作者不关心作为入口文件的''main''或者“main”模块 , 因为执行时只需用它们的包名即可 。 我认为这也暗示了入口模块不该再被其它模块 import 。 我上篇文章 [6]比作者的观点激进 , 认为连那句 if 语句都不该写 。 )


推荐阅读