以脚本形式运行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 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

Original: https://www.cnblogs.com/dechinphy/p/pym.html
Author: DECHIN
Title: 以脚本形式运行python库

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/715289/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 部署-jenkins与gitlab结合使用

    jenkinis配置 在之前的博文中,博主已经搭建好了gitlab和jenkins环境。接下来,博主就要进行gitlab和jenkins的联合使用。 源码仓库配置 这里,我们需要配…

    技术杂谈 2023年7月23日
    073
  • 深度学习研究生第一年之际,前来谈谈自己的感受

    前言 在即将结束研究生第一年之际,前来谈谈自己的感受。 你可以把这篇文章当做深度学习者、程序员、研究生的简短自白。可能会有点啰嗦,会有点无趣。但如果有时间、感兴趣,不妨阅读阅读,或…

    技术杂谈 2023年7月11日
    084
  • Spark中广播TensorFlow模型

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年6月21日
    098
  • urandom和random区别

    linux中提供了 /dev/urandom 和 /dev/random 两个特殊设备来提供随机数。那么这两个文件有什么区别呢?要回答这个问题,先需要了解熵这个概念。 熵linux…

    技术杂谈 2023年7月24日
    077
  • 66.落空

    dfsd posted @2022-09-28 08:39 随遇而安== 阅读(8 ) 评论() 编辑 Original: https://www.cnblogs.com/55zj…

    技术杂谈 2023年6月21日
    082
  • 【springcloud】3.记一次网关优化

    今天早上过来突然被告知我们提供给外系统的接口服务出问题了,失败率高达20% 很奇怪,昨天周末,今天也没做什么处理,怎么突然变成这样了 1.接口测试 第一反应是接口是不是出问题了,然…

    技术杂谈 2023年7月24日
    085
  • 【Golang】golang实现urlencode urldecode函数

    golang实现urlencode函数、 urldecode函数,url加解密函数 func UrlEncode(str string) string { return url.Q…

    技术杂谈 2023年6月1日
    064
  • 初步体验 Kubernetes 的 Custom Resource Definition

    CRD(Custom Resource Definition) 是 kubernetes 强大扩展能力的一处体现,联系到编程场景,CRD 相当于是类(class),custom r…

    技术杂谈 2023年5月31日
    0109
  • tcpdump使用教程

    一、说明 在分析了wireshark使用方法后,其表达式书写基本没什么问题,但在linux上使用的更多是tcpdump。 tcpdump自大学就开始在用了,但一直没搞懂其表达式的书…

    技术杂谈 2023年5月31日
    094
  • IfcTimeSeriesDataTypeEnum

    IFCTimeSriesDataTypeEnum描述了一种时间序列数据类型,用于确定未明确指定的时间序列期间的值。 IFC2x2中的新枚举。 Enumeration definit…

    技术杂谈 2023年5月31日
    094
  • vue辅助函数mapState和mapGetter前面三个点到底是什么意思:对象展开运算符

    mapState 函数返回的是一个对象。我们如何将它与局部计算属性混合使用呢? 通常,我们需要使用一个工具函数将多个对象合并为一个,以使我们可以将最终对象传给 computed 属…

    技术杂谈 2023年6月1日
    089
  • localstorage 过期时间

    很遗憾,localstorage原生是不支持设置过期时间的,想要设置的话,就只能自己来封装一层逻辑来实现: function set(key,value){ var curtime…

    技术杂谈 2023年5月31日
    089
  • 区块链–构建于技术创新之上的理想国

    前言 作为最近最火热的热潮之一,区块链吸引了大众的眼球。不管是互联网从业人员、金融行业从业人员,还是投机者、传销者,都对区块链充满了好奇和期待,寄希望于通过区块链创造财富和价值。那…

    技术杂谈 2023年7月23日
    080
  • Worktile协同特色之二:任务看板管理

    什么是看板 看板是一种使用可视化管理的方式,跟踪任务在整个价值流中流经的不同阶段,通常我们会用带贴纸的白板,或是电子卡片墙。具备如下几个特征:1. 流程可视化 把工作拆分成小块,一…

    技术杂谈 2023年5月31日
    0100
  • html大文件分段传输

    总结一下大文件分片上传和断点续传的问题。因为文件过大(比如1G以上),必须要考虑上传过程网络中断的情况。http的网络请求中本身就已经具备了分片上传功能,当传输的文件比较大时,ht…

    技术杂谈 2023年5月30日
    0118
  • Metalama简介2.利用Aspect在编译时进行消除重复代码

    上文介绍到 Aspect是 Metalama的核心概念,它本质上是一个编译时的AOP切片。下面我们就来系统说明一下 Metalama中的 Aspect。Metalama简介1. 不…

    技术杂谈 2023年5月31日
    087
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球