2020年6月11日

command line 參數

import sys print("the number of arguments is %d" % len(sys.argv)) print(sys.argv) for i in range(len(sys.argv)): print("%d:" % i + sys.argv[i]) 執行:
$ python testarg.py a b c
the number of arguments is 4
['testarg.py', 'a', 'b', 'c']
0:testarg.py
1:a
2:b
3:c

2020年6月9日

modify module path in source code

import module 的 search path,可以用下面的 code 列出來.. import sys print(sys.path) 結果: ['', 'C:\\Users\\charles.chang\\Anaconda3\\envs\\mytest\\python38.zip', 'C:\\Users\\charles.chang\\Anaconda3\\envs\\mytest\\DLLs', 'C:\\Users\\charles.chang\\Anaconda3\\envs\\mytest\\lib', 'C:\\Users\\charles.chang\\Anaconda3\\envs\\mytest', 'C:\\Users\\charles.chang\\Anaconda3\\envs\\mytest\\lib\\site-packages'] 所以就可以修改 sys.path,變更程式 import module 的 search path..
例如 sys.path.insert(0,"C:\\mymodule") 當然,這行code 要寫在 import 之前...

2020年5月31日

numpy : save and load. 存檔與讀檔

numpy 的 save 和 load 可以作到把 save 物件的身份和資料都紀錄。 例如:complex.. import numpy as np A = np.array([1+2j, 3+4j, 5+6j]) np.save('Adata',A) B = np.load('Adata.npy') print(B) 執行結果: [1.+2.j 3.+4.j 5.+6.j] B 從 Adata.npy load 資料後,自動成為 complex type array.

2019年6月19日

venv : virtual environment

venv 會在目前目錄下 create 一個 virtual environment 用的目錄(在 venc create 時指定)。
並且把目錄加進 sys.path 中。

之後,在這個virtual environment 中安裝的 python module,都會裝在這個目錄中,而不會是系統 /usr/lib/...

這樣是為了解決 python module 一堆相依和版本衝突情況。
讓每一個 project 存放自己需要的版本。
--- 但是這樣project folder 不就變很大?

使用方式是:
到project folder 下.. python3 -m venv myenv source myenv/bin/activate 然後你就會看到 prompt 會多一個 (myenv),代表你現在是在 virtual environment 的環境。
要退出的話,直接: $ deactivate


python2 跟 python3 的 command 不一樣,但是動作是相同的。
python2 沒有 venv 這個 command,所以要直接用virtualenv: virtualenv myenv source myenv/bin/activate


另外,在 venv 狀態下 pip install 的 package 都會安裝在local 的 myenv 目錄下,
所以將來要在另一個地方重建的話,有必要要把目前venv 安裝的東西都再裝一次。
先把安裝的module列出: $ pip freeze > requirements.txt 這個 requirement.txt 就是目前venv環境中所有安裝的 module.

之後,到新環境,只要: $ pip install -r requirements.txt 就可以把一樣的 module 都裝起來

2018年6月13日

decorator -- '@' symbol

在 python bluetooth 的 sample code 看到很多 function 開頭有 @ 符號,
找了一下,原來是 python 特有的 decorator 功能。

這一篇 的說明,配合循序漸進的 example code,可以清楚說明這個 @ 符號的功能。

因為沒辦法簡短的說明,所以...
以
@deco_function
def myfunc():
 ..
經過@deco_function 之後,myfunc( ) 已經不是 myfunc( ) 了....


這一篇 也一樣...循序漸進...
這一篇 是中文的...

2011年3月30日

pdb - gdb like , python online debugger module

ref : http://pythonconquerstheuniverse.wordpress.com/category/the-python-debugger/

用這個 module 後,就可以像 gdb 一樣對 python code 作單步執行。
但是 python 是直譯式語言,所以要修改 code...
大概就是:
  1. import pdb
  2. 在要開始 trace 的地方加入 pdb.set_trace()

這樣 執行到 pdb.set_trace( ) 這一行,就會中斷,出現 (Pdb) 的 promt,要你輸入command。
用 help 可以顯示一些 ..
(Pdb) help

Documented commands (type help <topic>):
========================================
EOF bt cont enable jump pp run unt
a c continue exit l q s until
alias cl d h list quit step up
args clear debug help n r tbreak w
b commands disable ignore next restart u whatis
break condition down j p return unalias where

Miscellaneous help topics:
==========================
exec pdb

Undocumented commands:
======================
retval rv

os.walk

要處理目錄結構用的
import os

for rootpath, dirlist, filelist in os.walk("./"):
print rootpath, dirlist, filelist

就可以看出效果,以這樣的目錄結構:
.
|-- 2
| |-- 3
| | |-- 4a
| | `-- 4b
| `-- 3a
|-- 2a
`-- 2b
`-- X


剛剛的code會print:
./ ['2b', '2'] ['2a']
./2b [] ['X']
./2 ['3'] ['3a']
./2/3 [] ['4b', '4a']

印出 4 行,也就是說,上面的 code, ,loop 4 次。


walk 的方式分為 TopDown 和 ButtomUp (TopDown=False).

TopDown 的時候,可以刪掉 dirlist 的內容,這樣接下來的 walk 就不會進去..
import os

for rootdir,dirlist,filelist in os.walk('./'):
print rootdir, dirlist, filelist
if '2b' in dirlist:
dirlist.remove('2b')

結果,2b 的內容就不會出現:
./ ['2b', '2'] ['2a']./2b [] ['X']
./2/3 [] ['4b', '4a']
./2 ['3'] ['3a']
./ ['2b', '2'] ['2a']

只有出現 3 次




ButtomUp 用在要刪除目錄的時候,因為目錄是空的就不能刪除,
所以要 ButtomUp..

上面的目錄結構用 os.walk('.',topdown=False) 結果是
./2b [] ['X']
./2/3 [] ['4b', '4a']
./2 ['3'] ['3a']
./ ['2b', '2'] ['2a']