以腳本形式運行python庫
技術背景
當我們嘗試運行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 //upload.pypi.org/legacy/ dist/*
這樣一來,我們就可以通過pip來對我們的倉庫進行安裝和管理,比如可以使用如下的指令安裝hadder:
$ python3 -m pip install hadder --upgrade
總結概要
本文主要通過一個實際的案例,介紹了如何可以在命令行中調用和運行我們的python模組。「python -m」這個方案為我們提供了一個新的選項,這個運行方法以「main.py」文件為入口文件運行,結合python中常用的命令行工具argparse,我們就可以很容易的創建一個可以通過命令行運行和獲取參數的python模組。並且可以使用twine上傳到pypi網站上,用pip進行安裝和管理,會更加的便捷。
版權聲明
本文首發鏈接為://www.cnblogs.com/dechinphy/p/pym.html
作者ID:DechinPhy
更多原著文章請參考://www.cnblogs.com/dechinphy/
打賞專用鏈接://www.cnblogs.com/dechinphy/gallery/image/379634.html
騰訊雲專欄同步://cloud.tencent.com/developer/column/91958
CSDN同步鏈接://blog.csdn.net/baidu_37157624?spm=1008.2028.3001.5343
51CTO同步鏈接://blog.51cto.com/u_15561675