git 忽略__pycache___容易被忽略的 Python 命令行参数

v2-9157562778607718e40ac6ffdf405ee0_1440w.jpg?source=172ae18b

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

# demo.py#!/bin/env/python3
import subprocessprint('First line 1')
subprocess.run("echo Second line 2", shell=True, check=True)
print('Third line 3')

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

$ python3 demo.py 
First line 1
Second line 2
Third line 3

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

$ python3 demo.py > 1.out
$ cat 1.out 
Second line 2
First line 1
Third line 3

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

$ python3 -u demo.py > 2.out
$ cat 2.out 
First line 1
Second line 2
Third line 3

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

- m <module-name>

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

# 第一个 venv 是模块名字,第二个 venv 是创建的虚拟环境的名字
$ python -m venv venv
$ ls -lh venv/
total 4.0K
drwxrwxr-x. 2 yq yq 173 Aug 20 21:38 bin
drwxrwxr-x. 2 yq yq   6 Aug 20 21:38 include
drwxrwxr-x. 3 yq yq  23 Aug 20 21:38 lib
lrwxrwxrwx. 1 yq yq   3 Aug 20 21:38 lib64 -> lib
-rw-rw-r--. 1 yq yq  75 Aug 20 21:38 pyvenv.cfg
# 激活虚拟环境
$ source venv/bin/activate
# 推出虚拟环境
(venv) $ deactivate# 利用模块 timeit 计算 Python 代码时间
$ python3 -m timeit '"-".join(str(n) for n in range(100))'
10000 loops, best of 3: 49.2 usec per loop
$ python3 -m timeit '"-".join([str(n) for n in range(100)])'
10000 loops, best of 3: 42.2 usec per loop
$ python3 -m timeit '"-".join(map(str, range(100)))'
10000 loops, best of 3: 32.7 usec per loop

- u

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

# 下面是 Python print 函数的接口
print(*objects, sep=' ', end='n', file=sys.stdout, flush=False)# print 函数默认在输入内容后面加上 'n',因而只要接收到一个数字,便会输出
>>> for i in range(3):
...     print(i)
... 
0
1
2# print 函数的参数 end 改成了空字符串,因而输出内容会默认缓冲
# 输出内容 012 缓存后一起输出
>>> for i in range(3):
...     print(i, end = '')
...     time.sleep(0.2) 
... 
012# 和上面相比,这里设置 flush 为 True
# 因此最终的显示效果会是接收到输出内容 1 的时候,就会立即输出
# 下面这段代码会依次显示0 1 2,而不是一次性输出012
for i in range(3):
...     print(i, end = '', flush=True)
...     time.sleep(0.2) 
... 
012

- b

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

$cat compare.py 
str1 = '23'
bytes1 = b'23'
bytearray1 = bytearray(b'23')
int1 = 23if str1 == bytes1:print('Equal!')if str1 == bytearray1:print('Equal!')if bytes1 == int1:print('Equal!')$ python -b compare.py 
compare.py:6: BytesWarning: Comparison between bytes and stringif str1 == bytes1:
compare.py:9: BytesWarning: Comparison between bytearray and stringif str1 == bytearray1:
compare.py:12: BytesWarning: Comparison between bytes and intif bytes1 == int1:# 使用 -bb 的时候,会抛出错误而不是警告 
$ python -bb compare.py 
Traceback (most recent call last):File "compare.py", line 6, in <module>if str1 == bytes1:
BytesWarning: Comparison between bytes and string

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

-B: 是否生成相应的 `pyc` 文件
-c cmd:执行字符串命令 `cmd`
-d:启用调试
-E:忽略所有的 `PYTHON*` 环境变量
-I:忽略用户自己的环境信息,包括
-O:生成的 `pyc` 文件不包含 `assert` 语句和 `__debug__` 信息
-OO:在 `-O` 的基础上,进一步忽略代码的一些注释字符串
-q:交互式模式下不显示 Python 的版本和版权信息
-s:排除用户自己安装的 Python 模块
-S:在启动 Python 的时候不导入模块 `site`
-v:打印更多的代码执行的相关信息
-V:打印 Python 解释器的版本号
-W arg:警告的相关控制参数
-x:跳过代码里面的第一行(`#!cmd`)
-X:一些 Python 代码执行时的参数控制
--check-hash-based-pycs:设置是否对 `pyc` 文件进行 hash 校验

等有空了在好好看看 Python 官方文档里关于 Command line and environment 这一章节,将其中和 Python 相关的环境变量给大家在好好介绍一下。

参考链接

[1] https://docs.python.org/3/using/cmdline.html?highlight=pythonunbuffered

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kindeditor和easyui整合出不来

1.首先必备的三个导入的文件 <link rel"stylesheet" href"/day0320_maven_pm/libs/kindeditor/themes/default/default.css"/> <script charset"utf-8" src"/day0320_maven_pm/libs/kindeditor/kindeditor-all-min.js">&l…

虚拟机共享服务器设置,虚拟机共享网络设置教程

vm虚拟机网络共享设置&#xff1a;设置以前首先要确认“虚拟机”中的“本地连接”IP地址为自动获得&#xff01;1.在虚拟机设置里&#xff0c;单击以太网----网络连接类型为---NTA 使用以共享的主机IP地址&#xff01;2.单击编辑---虚拟网络参数&#xff01;3.单击自动桥接。去…

靠数学“拿了”两次诺贝尔奖,彭罗斯从“铺地砖”帮忙发现2011年化学奖的秘密...

来源&#xff1a;量子位诺贝尔奖没有数学奖&#xff0c;但是如果数学足够好的话&#xff0c;可以拿两次诺贝尔奖&#xff1a;帮别人拿一次&#xff0c;自己再拿一次。刚刚获得诺贝尔奖的英国数学家罗杰彭罗斯&#xff08;Roger Penrose&#xff09;就是这样。今年&#xff0c;彭…

linux 查看网卡是否万兆_linux 如何查看网卡带宽

1.先查看网卡# ifconfigdocker0: flags4163 mtu 1500inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255inet6 fe80::42:acff:fe45:985 prefixlen 64 scopeid 0x20ether 02:42:ac:45:09:85 txqueuelen 0 (Ethernet)RX packets 141370815 bytes 100379736898 (93.4 …

计算机能力挑战赛_蓝桥杯、PAT、CCF CSP、团体程序设计天梯赛、传智杯、计算机能力挑战赛、软考等大学生编程比赛/考试介绍...

介绍7个适合普通大学生参加的编程比赛/考试&#xff08;注&#xff1a;有的比赛如蓝桥杯有多种赛别&#xff0c;本文仅介绍其中的程序设计/编程比赛&#xff09;。编程入门书籍推荐《算法笔记》&#xff0c;内容详细易懂&#xff0c;对新手非常友好&#xff0c;描述语言为C结合…

PowerDesigner 中SQL文件、数据库表反向生成PDM

1 反向生成PDM 1) 创建一个空的PDM模型&#xff08;选择对应的DBMS&#xff09;&#xff1a; 2) 选择【Database】--【Update Model from Database…】菜单&#xff1a; 1.1 使用SQL文件 1) 在新窗口选择对应【Using script files】--【&#xff…

上传excel文件到服务器,excel怎么上传到云服务器

excel怎么上传到云服务器 内容精选换一换安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具&#xff0c;将文件上传到云服务器。例如QQ.exe。在本地主机和Windows云服务器上分别安装数据传输工具&#xff0c;将文件上传到云服务器。例如QQ.exe。本地磁盘映射(推荐…

沈南鹏谈科学:第一性原理,“无为”而“有趣”

勇于探索未知&#xff0c;才能发展科学。10月30日-11月1日&#xff0c;第三届世界顶尖科学家论坛在上海举行。今年的世界顶尖科学家论坛是特殊之年的一场世界级科学盛会。横跨四大洲、11个时区、25个国家和地区、100多座城市&#xff0c;此次论坛云集了全球230余位科学家&#…

设置目录_[LaTeX 尝试] titletoc - 为算法目录、定理目录等设置子目录

本文已加入专栏文章目录&#xff0c;归入「进阶使用」文章系列。titletoc 宏包提供了定制目录列表样式的功能&#xff0c;本文主要讨论其中的「创建子目录」功能。标准目录的子目录LaTeX 的典型目录通过 tableofcontents 输出&#xff0c;一个文档里最多使用一次。在实践中&…

postgresql 远程用户_构建Python pandas基于SSH远程MySQL和PostgreSQL的数据分析

背景知识视频教程Python中使用Pandas教程 - 国外课栈​viadean.comPandas数据分析与探索 - 国外课栈​viadean.com如果您无法从外部环境直接访问数据库&#xff0c;则可能需要SSH隧道来查询它。 在这篇文章中&#xff0c;我将向您展示如何通过SSH连接并查询MySQL数据库到Pandas…

python函数:基础函数调用整理

声明&#xff1a;以下链接和描述据来自于网络&#xff0c;很多都是来自菜鸟教程 一、字符串 str python字符串格式化符号:%c格式化字符及其ASCII码 %s格式化字符串%d格式化整数函数描述需要掌握(示例) print(name[0])  按索引取值(正向取反向取) &#xff1a;只能取print(nam…

云服务器主机性能测试,云服务器主机性能测试

弹性云服务器 ECS弹性云服务器(Elastic Cloud Server)是一种可随时自助获取、可弹性伸缩的云服务器&#xff0c;帮助用户打造可靠、安全、灵活、高效的应用环境&#xff0c;确保服务持久稳定运行&#xff0c;提升运维效率三年低至5折&#xff0c;多种配置可选了解详情Linux云服…

文治者必有武备不然长大了挨欺负_2017届高考语文全国卷文言文专题阅读15篇(附答案)...

2017届高考语文全国卷文言文专题阅读15篇(附答案)1.阅读下面这篇文言文&#xff0c;完成问题。高永能&#xff0c;字君举&#xff0c;世为绥州人。初&#xff0c;伯祖文呸举州来归&#xff0c;即拜团练使&#xff0c;已而弃之北迁&#xff0c;其祖文玉独留居延州&#xff0c;至…

达尔文之过:人类真的和其他生物平等吗?

1859年发表的《物种起源》 图片来源&#xff1a;Wikimedia Commons来源&#xff1a;环球科学人类在自然界中的地位&#xff0c;真的如达尔文与赫胥黎认为的那样&#xff0c;“与其他生物平等”吗&#xff1f;这种贬抑人类地位的理想化理念&#xff0c;或许推进了人类对大自然肆…

c++矩阵连乘的动态规划算法并输出_算法面试必修课,动态规划基础题型归纳(三)

动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09;&#xff0c;是大家都觉得比较难以掌握的算法。为了应付面试&#xff0c;我们经常会背诵一下DP问题的源码&#xff0c;其实&#xff0c;只要理解了思想&#xff0c;掌握基本的模型&#xff0c;然后再来点…

css 学习记录

如何引入css 内联样式 在标签内 添加style style标签 外联式写法 新建CSS文件 通过用link标签引入css样式文件 import url(../);、 css语法 选择器 {属性&#xff1a;值&#xff1b;} CSS属性 float的属性可以使元素左右浮动 设置字体的样式 color属性 用于 设置字体颜色 …

网站服务器睡眠后还能访问吗,远程服务器可以睡眠吗

远程服务器可以睡眠吗 内容精选换一换已成功添加Guardian。如果Guardian处于在线状态&#xff0c;只允许修改Guardian名称。如果Guardian处于连接超时状态&#xff0c;可以输入登录远程服务器的用户名和密码重新部署Guardian。如果Guardian处于在线状态&#xff0c;只允许修改G…

srgan要训练多久_SRGAN阅读笔记

AbstractCNN在传统的单帧超分辨率重建上取得了非常好的效果&#xff0c;可以取得较高的峰值信噪比(PSNR)。他们大都以MSE为最小化的目标函数&#xff0c;这样虽然可以取得较高的峰值信噪比&#xff0c;但是当图像下采样倍数较高时&#xff0c;重建的得到的图片会过于平滑&#…

sql server如何输出排序序号_Group by中子查询order by排序失效问题分析

通过sql分组查询数据时&#xff0c;一般通过group by来完成&#xff0c;group by默认取相同的分组列(一列或者多列)中第一个数据。如果想获取sql分组中id最大的记录&#xff0c;我们可能想到的sql如下&#xff08;name列作为分组&#xff09;&#xff1a;select id,name from (…

深入学习Redis(1):Redis内存模型

前言 Redis是目前最火爆的内存数据库之一&#xff0c;通过在内存中读写数据&#xff0c;大大提高了读写速度&#xff0c;可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时&#xff0c;会接触Redis的5种对象类型&#xff08;字符串、哈希、列表、集合、有序集合&…