bash忽略错误继续执行_容易被忽略的 Python 命令行参数

上周编写了一个 Python 脚本用于将一堆包含 oracle dmp 文件的 rar 压缩包恢复到 oracle 数据库。由于 oracle dmp 文件恢复速度较慢,通过nohup commad 2>&1 &提交命令到后台运行。运行过程中发现通过print命令输出内容无法及时地重定向到nohup.out文件,nohup.out文件里面会先显示调用bash命令的输出内容,然后再显示print语句的输出内容,而不会按顺序显示响应的内容。这里,编写一个简单的脚本模拟一下。

aa1f07f8f5d188c44b820d6096750e75.png

直接执行命令python3 demo.py ,得到的输出结果如下:

f5d9cefbd2b57629fdfbd881dbe8ce89.png

通过命令python3 demo.py > 1.out重定向到1.out文件的结果如下:

a6549c1b98a564f10e7a545866fab332.png

可以看到重定向后的输出内容的顺序和没有重定向的输出顺序不一样,使用echo命令的内容被重定向到文件demo.out以后,两条print语句的内容才顺序显示出来。后面去请教了一个同事,经过这个同事的指导才知道是因为再重定向的时候如果不指定-u选项,那么 Python 会默认将标准输出和标准错误进行缓存,等缓存区满了以后,再整体输出:

9bb9e1d0326bb16b5aac405b0d3663ce.png

问题解决以后,才理解了最近在编写使用 Python 项目的 Dockerfile 时,参照官方教程加上指令:ENV PYTHONUNBUFFERED 1 的含义。后来好好看了一下 python --help 的输出信息,才突然发现原来 Cpython 解释器支持这么多的命令行选项,因此写了这篇文章将这些容易被忽略的命令行参数好好说明一下。

- m <module-name>

以脚本的形式运行相应的模块,也就是执行相应Python 包在 __main__ 脚本里的内容,如果该块能够以脚本的方式运行的话。最常用的是虚拟环境管理模块 venv 和 Python 代码运行时间计算模块 timeit ,举例如下:

f3272fcc81eb9a60b5d407e95434959e.png

- u

强制标准输出流和标准错误流不进行缓存,直接输出。如上所述,当我们需要重定向 Python 脚本的输出到一个文件的时候,在执行脚本的时候加上 -u 参数,能够让内容及时输出到对应的文件,而不会出现顺序混乱的结果。而当我们使用交互的 Python解释器的时候,stdout 输出流默认是行缓存的 (line-buffered),因而我们直接使用 print 语句进行输出的时候,内容会及时显示,因为 print 函数包含了默认参数 end='n' ,举例如下:

bb1baea5151478565f94e967850dc5c2.png

- b

当代码里面包括以下类型的比较的时候,Python 解释器会给出警告提示:1. 字符串类型(str)和 字节类型(bytes);2. 字符串类型(str)和字节数组类型(bytearrary);3. 字符串类型(str)和 整数类型(int)。举例如下:

b779daae8fa440d53d4d71885b927ae1.png

关于更多的 Python 命令行参数,可以参照 Python 的官方文档,也可以通过python --help查看。这里不在详细介绍每一个参数,剩下的参数大致包括以下内容:

9e3f0ab48ac271e0fa72754910e15433.png

等有空了在好好看看 Python 官方文档里关于Command line and environment

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值