Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >以脚本形式运行python库

以脚本形式运行python库

作者头像
DechinPhy
发布于 2022-09-02 09:05:23
发布于 2022-09-02 09:05:23
1.2K00
代码可运行
举报
文章被收录于专栏:Dechin的专栏Dechin的专栏
运行总次数:0
代码可运行

技术背景

当我们尝试运行python的帮助文档时,会看到如下这样的一个说明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ 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的具体代码架构与相关模块内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ 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接口的调用方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from hadder import AddHydrogen
AddHydrogen('input.pdb', 'output.pdb')

对外开放的API接口就这么一个,较为简单。接下来我们就可以基于这个功能模块,去创建一个可以通过命令行来运行的方法。

创建__main__.py文件

当我们使用python3 -m模式来运行的时候,python会去自动索引到__main__.py这个文件作为入口文件,因此首先我们在根目录下创建一个__main__.py文件,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ 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文件中的代码内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# __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,使得我们可以在命令行里面输入相关的输入文件路径和输出文件路径。最终运行效果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ 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仓库的“三步走”方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ python3 setup.py check
$ python3 setup.py sdist bdist_wheel
$ twine upload --repository-url https://upload.pypi.org/legacy/ dist/*

这样一来,我们就可以通过pip来对我们的仓库进行安装和管理,比如可以使用如下的指令安装hadder:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ python3 -m pip install hadder --upgrade

总结概要

本文主要通过一个实际的案例,介绍了如何可以在命令行中调用和运行我们的python模块。“python -m”这个方案为我们提供了一个新的选项,这个运行方法以“main.py”文件为入口文件运行,结合python中常用的命令行工具argparse,我们就可以很容易的创建一个可以通过命令行运行和获取参数的python模块。并且可以使用twine上传到pypi网站上,用pip进行安装和管理,会更加的便捷。

版权声明

本文首发链接为:https://cloud.tencent.com/developer/article/2092977

作者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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用sonatype/nexus构建企业级内部pypi仓库之demo演示
这一步你也可以借助~/.pypirc搭配twine实现更精简的方式操作,具体看你个人喜好而定。
追马
2020/07/03
8880
分享一个日常使用的一段shell脚本
日常开发经常要简化很多操作可以用make 工具封装很多命令干活,但是在docker 容器内有时候为了简化镜像的大小和避免风险都没有安装make ,但是又需要用很多已命令的命令执行任务,索性就用shell封装好一个类似make 的模板,如下所示 #!/usr/bin/env bash #/ PATH=./node_modules/.bin:$PATH #/ https://www.tldp.org/LDP/abs/html/options.html # Similar to -v (Print each co
IT大咖说
2022/08/26
3040
分享一个日常使用的一段shell脚本
Python包的创建、打包和发布
在这篇文章中,我将向你展示如何创建一个 Python 包,然后将其打包并发布到 Python 包索引(PyPI)上。这是一个非常实用的技能,可以让你的代码更容易被其他人使用和分享。
蚂蚁蚂蚁
2024/03/27
9630
手把手教你开展mofish库(摸鱼库)的打包发布
前几天吴老板给我推荐了一个摸鱼库,竟然是Python库,给我惊了一下,感觉应缺斯汀。
Python进阶者
2022/03/10
4210
手把手教你开展mofish库(摸鱼库)的打包发布
如何发布一个Python命令行工具
上次写的一个终端里面斗鱼TV弹幕Python版本和Ruby版本,并且发布到PIP和RubyGems上面.在发布PIP包的时候,居然Google不到一篇可以非常好的讲解这个流程的文章.于是整理这篇文章,并且方便后来自己检索,并且方便他人找资料. 自推荐下依照本文定制的命令行工具danmu.fm的github地址: https://github.com/twocucao/danmu.fm 本文的目的也是非常简单: 写一个Python命令行工具,并且发布到PIP上面.并且在这个过程中给出我自己的一些思考. 如何分
CDA数据分析师
2018/02/05
1.7K0
如何发布一个Python命令行工具
在GitHub上发布一个Python项目需要注意哪些
本篇介绍个人或企业在 GitHub 上发布一个 Python 项目需要了解和注意哪些内容
Peter Shen
2020/09/18
1.4K0
最全总结:把模块当做脚本来执行的 7 种案例及其原理
github仓库: https://github.com/iswbm/magic-python
Python进阶者
2020/09/22
4900
最全总结:把模块当做脚本来执行的 7 种案例及其原理
python中命令行的应用实践
小k是一家互联网公司的爬虫(cv)工程师,他在这家公司写过大大小小无数个爬虫脚本。有一天他打开自己写过的一个爬虫项目,看到密密麻麻几十个网站的spider文件,内心暗喜,”我真是个人才,居然能写出这么多优秀且稳定的代码“。忍不住得将项目截图发给小m,等待着即将回复的:”卧槽牛逼啊“,但随即等来的却是一句:”你这么多爬虫文件,你怎么运行的?“,小k一时语塞,陷入了沉思:
MicLon
2023/02/25
6030
两行代码,为 Python 脚本生成命令行!
我们定义了一个 Python 的方法,方法接收一些参数,但是调用的时候想将这些参数用命令行暴露出来。
程序员小二
2022/01/12
3160
Python程序打包指南:手把手教你一步步完成
最近感兴趣想将开发的项目转成Package,研究了一下相关文章,并且自己跑通了,走了一下弯路,这里记录一下如何打包一个简单的Python项目,展示如何添加必要的文件和结构来创建包,如何构建包,以及如何将其上传到Python包索引(PyPI)。
用户3578099
2023/11/16
2K0
Python程序打包指南:手把手教你一步步完成
Python 中 -m 的典型用法、原理解析与发展演变
在命令行中使用 Python 时,它可以接收大约 20 个选项(option),语法格式如下:
Python猫
2019/11/12
1.2K0
Python 中 -m 的典型用法、原理解析与发展演变
我是如何培养新人的:关于如何制作一个python库?
我喜欢提出问题给新人去解决,而不会直接把答案告诉他。最近在工作中完成了一些文本分类的算法,涉及到最后的工程化问题,于是我布置了个作业,要求是把代码整理成python,并发布,方便调用。
mixlab
2019/12/17
8210
Python3:图片转字符画
参考:https://www.shiyanlou.com/courses/370/labs/1191/document
py3study
2020/01/06
1.2K0
【python系列】手把手教你在pypi发布自己的包-他人可pip下载
看了挺多资料,做了挺多事情,学了挺多乱七八糟的知识,笔记记得乱糟糟的,以至于一直没有整理发文(啊其实我就是懒),各位见谅。
梦无矶小仔
2023/08/03
2K0
【python系列】手把手教你在pypi发布自己的包-他人可pip下载
2019-02-20 在PyPI测试平台
参考Packaging Python Projects, 源码在nobodxbodon/test-package-for-pypi
py3study
2020/01/17
3590
使用 setup.py 将 Python 库打包分发到 PyPI 踩坑指南
前段时间写了一个 django 的应用安装包打包上传到了 PyPI,由于是第一次打包分发,所以趁机研究了一下 Python 打包的相关注意事项。网上的确是可以搜到很多相关资料,但是我发现很多人都在无脑复制粘贴或者简单的提供了一份打包配置,一点不实际也不实用,而我最喜欢的就是分享实际经验,所以这次也不例外,来分享踩坑指南。
Hopetree
2022/09/26
1.6K0
python打包分发工具setuptoo
格式大概是上面这样了,这是一个没有自定义命令子选项的最简单例子,下面是一个稍微复杂的例子,它的作用是将包发布到pypi:
py3study
2020/01/20
5720
教师妹学python之十:共享代码
PyPi 是 Python Package Index 的首字母简写,其实表示的是 Python 的 Packag 索引,这个也是 Python 的官方索引。
互联网金融打杂
2022/08/01
4400
教师妹学python之十:共享代码
从开发属于你自己的第一个 Python 库,做一名真正的程序员「双语版」
你好,我是悦创。之前我在 CSDN 编写了一篇开发 Python 库的教程,有人加我提问到的一些问题,我来更新一下这篇文章:https://blog.csdn.net/qq_33254766/article/details/119874997
AI悦创
2022/06/28
5200
从开发属于你自己的第一个 Python 库,做一名真正的程序员「双语版」
How to Publish Your Code as a Pip Module
上周,我制作了一个Python命令行界面(CLI)工具。为了让它使用起来更方便,我想把它发布成一个pip模块,于是我做了一些研究,也犯了些错误,最终成功了。
timerring
2025/02/03
430
推荐阅读
相关推荐
使用sonatype/nexus构建企业级内部pypi仓库之demo演示
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验