涨见识了,在终端执行 Python 代码的 6 种方式
译者 | 豌豆花下猫@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 语句都不该写。)
目录
定义__main__.py
也可以扩展到目录。如果你看一下促成此博客文章的示例,python news
可执行,就是因为 news 目录有一个 __main__.py
文件。该目录就像一个文件路径被 Python 执行了。
现在你可能会问:“为什么不直接指定文件路径呢?”好吧,坦白说,关于文件路径,有件事得说清楚。 关注公众号:拾黑(shiheibook)了解更多 [广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
随时掌握互联网精彩
- 1 澳门是伟大祖国的一方宝地 7979333
- 2 央视曝光未成年人绕开防沉迷只需4元 7941743
- 3 张雨绮 为了讨大家喜欢才穿成这样 7847953
- 4 2024 向上的中国 7795448
- 5 大S老公具俊晔站C位跳女团舞 7646056
- 6 停个车数据就泄露了 7536691
- 7 特朗普赞成TikTok继续在美国运营 7471744
- 8 汪峰红毯现场回应汪峰定律 7334425
- 9 男子暴瘦110斤后被质疑戴人皮面具 7253154
- 10 老人花2万买保健床垫后再不愿去医院 7145177