|涨见识了,在终端执行 Python 代码的 6 种方式
本文插图
本文插图
作者 | BRETT CANNON
译者 | 豌豆花下猫@Python猫
为了我们推出的 VS Code 的 Python 插件[1] , 我写了一个简单的脚本来生成变更日志[2](类似于Towncrier[3] , 但简单些 , 支持 Markdown , 符合我们的需求) 。 在发布过程中 , 有一个步骤是运行python news , 它会将 Python 指向我们代码中的''news''目录 。
前几天 , 一位合作者问这是如何工作的 , 似乎我们团队中的每个人都知道如何使用-m?请参阅我的有关带 -m 使用 pip 的文章[4] , 了解原因 。
这使我意识到其他人可能不知道有五花八门的方法可以将 Python 指向要执行的代码 , 因此有了这篇文章 。
本文插图
通过标准输入和管理
因为如何用管道传东西给一个进程是属于 shell 的内容 , 我不打算深入解释 。 毋庸置疑 , 你可以将代码传递到 Python 中 。
# 管道传内容给 python
echo ''print('hi')'' | python
如果将文件重定向到 Python , 这显然也可以 。
# 重定向一个文件给 python
python < spam.py
归功于 Python 的 UNIX 传统 , 这些都不太令人感到意外 。
本文插图
通过 -c 指定的字符串
如果你只需要快速地检查某些内容 , 则可以在命令行中将代码作为字符串传递 。
# 使用 python 的 -c 参数
python -c ''print('hi')''
当需要检查仅一行或两行代码时 , 我个人会使用它 , 而不是启动 REPL(译注:Read Eval Print Loop , 即交互式解释器 , 例如在 windows 控制台中输入python ,就会进入交互式解释器 。 -c 参数用法可以省去进入解释器界面的过程)
本文插图
文件的路径
最众所周知的传代码给 python 的方法很可能是通过文件路径 。
# 指定 python 的文件路径
python spam.py
要实现这一点的关键是将包含该文件的目录放到sys.path里 。 这样你的所有导入都可以继续使用 。 但这也是为什么你不能/不应该传入包含在一个包里的模块路径 。 因为sys.path可能不包含该包的目录 , 因此所有的导入将相对于与你预期的包不同的目录 。
本文插图
对包使用 -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 语句都不该写 。 )
推荐阅读
- 摄影|传音主导首个移动终端计算摄影系统国际标准获ITU-T正式立项
- 自动驾驶|AutoX获第二张加州全无人驾驶牌照;乐视控股被列为被执行人 | 晚报
- 手电|滴滴重启顺风车,专家建议女白领勿穿黑丝上夜班,网友:见识短浅
- 群众网|滴滴重启顺风车,专家建议女白领勿穿黑丝上夜班,网友:见识短浅
- 行业互联网|海信关联公司成被执行人,执行标的超20万元
- 机动车|北京人人车旧机动车经纪公司成被执行人 执行标的超104万
- 新浪网|北京人人车旧机动车经纪公司成被执行人 执行标的超104万
- |Avaya Open SIP智能终端,您智慧沟通的不二之选
- 充电器|OPPO 发布125W超级闪充技术,未来布局多终端、多场景闪充生态
- 科学探索|如果人类以2千倍的光速飞行,多久可以穿越银河系?看完长见识了
