以指令碼形式執行python庫

2022-07-05 12:07:19

技術背景

當我們嘗試執行python的幫助檔案時,會看到如下這樣的一個說明:

$ python3 -h
usage: python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
...
-m mod : run library module as a script (terminates option list)
...

這一個條目的意思是,我們可以使用python3 -m這樣的指令,在終端的命令列內執行python的一些倉庫。比如我們常用的pip,就可以通過python3 -m pip install numpy這樣的操作指令來執行。還有一個比較常見的上傳python編譯安裝包到pypi網站上面的工具twine,可以通過python3 -m twine的方法來使用。本文我們主要探討一下如何在程式碼中,實現python3 -m 這種命令列執行的模式。

基礎功能程式碼實現

通過python3 -m 這樣的方法來執行,本質上只是一個實現方式的改變,而不影響到具體演演算法的實現,這個形式跟我們直接通過python的API介面去呼叫是一樣的。所以我們需要先按照正常的API介面呼叫的方法,先把基礎程式碼模組寫好。這裡我們使用一個開原始碼倉庫hadder為例,來介紹一下具體的操作方法。我們先看一下Hadder的具體程式碼架構與相關模組內容:

$ tree hadder/
hadder/
├── examples # 範例
│   ├── case1-complete.pdb
│   ├── case1.pdb
│   ├── case2-complete.pdb
│   ├── case2-complete.png
│   ├── case2.pdb
│   └── case2.png
├── hadder # 根目錄
│   ├── constants.py # 存放一些常數
│   ├── __init__.py # 核心演演算法
│   └── parsers.py # 讀取PDB檔案
├── LICENSE
├── README.md
├── requirements.txt
└── setup.py

2 directories, 13 files

這裡先簡單說明一下背景,關於Hadder的具體內容和演演算法,可以參考這篇部落格。Hadder是一個用於給PDB檔案補氫原子的小工具,因為在蛋白質摺疊的預測過程中,主要以骨架為主,因此氫原子大部分情況下是被忽略的。而在後期建立蛋白質力場的時候,氫原子又是必須使用到的,因此我們可以用hadder這樣一個工具來實現補氫的功能。關於hadder我們就不進行更多的介紹了,主要看下其API介面的呼叫方法:

from hadder import AddHydrogen
AddHydrogen('input.pdb', 'output.pdb')

對外開放的API介面就這麼一個,較為簡單。接下來我們就可以基於這個功能模組,去建立一個可以通過命令列來執行的方法。

建立__main__.py檔案

當我們使用python3 -m模式來執行的時候,python會去自動索引到__main__.py這個檔案作為入口檔案,因此首先我們在根目錄下建立一個__main__.py檔案,如下所示:

$ tree hadder/
hadder/
├── examples # 範例
│   ├── case1-complete.pdb
│   ├── case1.pdb
│   ├── case2-complete.pdb
│   ├── case2-complete.png
│   ├── case2.pdb
│   └── case2.png
├── hadder # 根目錄
│   ├── constants.py # 存放一些常數
│   ├── __init__.py # 核心演演算法
│   ├── __main__.py # python -m 模式執行介面檔案
│   └── parsers.py # 讀取PDB檔案
├── LICENSE
├── README.md
├── requirements.txt
└── setup.py

2 directories, 14 files

然後我們就可以在__main__.py檔案中結合argparse來使用,實現一個命令列模式執行的功能,如下是__main__.py檔案中的程式碼內容:

# __main__.py
import argparse
from hadder import AddHydrogen

parser = argparse.ArgumentParser()

parser.add_argument("-i", help="Set the input pdb file path.")
parser.add_argument("-o", help="Set the output pdb file path.")

args = parser.parse_args()
pdb_name = args.i
save_pdb_name = args.o

AddHydrogen(pdb_name, save_pdb_name)

我們還是同樣的呼叫AddHydrogen這個API介面,但是由於使用了argparse,使得我們可以在命令列裡面輸入相關的輸入檔案路徑和輸出檔案路徑。最終執行效果如下:

$ python3 -m hadder -h
usage: __main__.py [-h] [-i I] [-o O]

optional arguments:
  -h, --help  show this help message and exit
  -i I        Set the input pdb file path.
  -o O        Set the output pdb file path.
  
$ python3 -m hadder -i input.pdb -o ouput.pdb 
1 H-Adding task with 3032 atoms complete in 0.116 seconds.

感興趣的也可以看看使用這個演演算法加氫前後的構象區別:

補充

一般我們完成了一個演演算法實現,需要開放給別人使用的時候。以python為例,最方便的做法是將python倉庫編譯後上傳到pypi網站上面,這樣大家可以使用pip來進行安裝和管理。這裡我們補充一個編譯上傳python倉庫的「三步走」方法:

$ python3 setup.py check
$ python3 setup.py sdist bdist_wheel
$ twine upload --repository-url https://upload.pypi.org/legacy/ dist/*

這樣一來,我們就可以通過pip來對我們的倉庫進行安裝和管理,比如可以使用如下的指令安裝hadder:

$ python3 -m pip install hadder --upgrade

總結概要

本文主要通過一個實際的案例,介紹瞭如何可以在命令列中呼叫和執行我們的python模組。「python -m」這個方案為我們提供了一個新的選項,這個執行方法以「main.py」檔案為入口檔案執行,結合python中常用的命令列工具argparse,我們就可以很容易的建立一個可以通過命令列執行和獲取引數的python模組。並且可以使用twine上傳到pypi網站上,用pip進行安裝和管理,會更加的便捷。

版權宣告

本文首發連結為:https://www.cnblogs.com/dechinphy/p/pym.html

作者ID:DechinPhy

更多原著文章請參考:https://www.cnblogs.com/dechinphy/

打賞專用連結:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

騰訊雲專欄同步:https://cloud.tencent.com/developer/column/91958

CSDN同步連結:https://blog.csdn.net/baidu_37157624?spm=1008.2028.3001.5343

51CTO同步連結:https://blog.51cto.com/u_15561675