git 忽略__pycache___容易被忽略的 Python 命令行参数
上周編寫了一個 Python 腳本用于將一堆包含 oracle dmp 文件的 rar 壓縮包恢復到 oracle 數據庫。由于 oracle dmp 文件恢復速度較慢,通過 nohup commad 2>&1 & 提交命令到后臺運行。運行過程中發(fā)現通過 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')直接執(zhí)行命令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 會默認將標準輸出和標準錯誤進行緩存,等緩存區(qū)滿了以后,再整體輸出:
$ 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 的輸出信息,才突然發(fā)現原來 Cpython 解釋器支持這么多的命令行選項,因此寫了這篇文章將這些容易被忽略的命令行參數好好說明一下。
- m <module-name>
以腳本的形式運行相應的模塊,也就是執(zhí)行相應Python 包在 __main__ 腳本里的內容,如果該塊能夠以腳本的方式運行的話。最常用的是虛擬環(huán)境管理模塊 venv 和 Python 代碼運行時間計算模塊 timeit ,舉例如下:
# 第一個 venv 是模塊名字,第二個 venv 是創(chuàng)建的虛擬環(huán)境的名字 $ 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 # 激活虛擬環(huán)境 $ source venv/bin/activate # 推出虛擬環(huán)境 (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 腳本的輸出到一個文件的時候,在執(zhí)行腳本的時候加上 -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)和 字節(jié)類型(bytes);2. 字符串類型(str)和字節(jié)數組類型(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:執(zhí)行字符串命令 `cmd` -d:啟用調試 -E:忽略所有的 `PYTHON*` 環(huán)境變量 -I:忽略用戶自己的環(huán)境信息,包括 -O:生成的 `pyc` 文件不包含 `assert` 語句和 `__debug__` 信息 -OO:在 `-O` 的基礎上,進一步忽略代碼的一些注釋字符串 -q:交互式模式下不顯示 Python 的版本和版權信息 -s:排除用戶自己安裝的 Python 模塊 -S:在啟動 Python 的時候不導入模塊 `site` -v:打印更多的代碼執(zhí)行的相關信息 -V:打印 Python 解釋器的版本號 -W arg:警告的相關控制參數 -x:跳過代碼里面的第一行(`#!cmd`) -X:一些 Python 代碼執(zhí)行時的參數控制 --check-hash-based-pycs:設置是否對 `pyc` 文件進行 hash 校驗等有空了在好好看看 Python 官方文檔里關于 Command line and environment 這一章節(jié),將其中和 Python 相關的環(huán)境變量給大家在好好介紹一下。
參考鏈接
[1] https://docs.python.org/3/using/cmdline.html?highlight=pythonunbuffered
總結
以上是生活随笔為你收集整理的git 忽略__pycache___容易被忽略的 Python 命令行参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python实现rpc框架_使用Pyth
- 下一篇: native.loadlibrary获取