利用Python命令行传递实例化对象的方法


Posted in Python onNovember 02, 2016

一、前言

在开发过程中,遇到了这样一个情况:我们需要在脚本中通过 suprocess.call 方法来启动另外一个脚本(脚本 B),当然啦,还得传递一些参数。在这些参数中,有一个需要传递的是一个实例化后的对象。我们知道,通过命令行的方式传递参数是基于字符格式的,也就是说脚本 B 只能接收到字符串格式的参数,那么如何接收启动脚本传递过来的实例化后的对象呢?

今天就来聊聊我使用的两种笨方法:使用 eval 以及使用 pickle base64 模块。

方法一:使用 eval

其实在代码中使用 eval 应该不算是 good practice,不过既然可以暂时解决问题,何不拿来试试?其实使用这种方法并不能在命令行中传递实例化后的对象,只是将实例化的过程放在脚本 B 中进行了。

以下是启动脚本:

import subprocess
class Student(object):
 def __init__(self):
  self.name = 'Chris'
  self.age = 30
 def __str__(self):
  return '\n'.join('{}:{}'.format(k_, v_) for k_, v_ in self.__dict__.items()
       if not k_.startswith('_'))
def start_script():
 # 我们把实例化的过程延迟
 commands = ['python3', '/home/chris/Projects/Python/movie_wisdom/script.py',
    'Student()']
 subprocess.call(commands)
if __name__ == '__main__':
 start_script()

以下是被启动的脚本,即脚本 B 代码:

from starter import Student
def main():
 student_obj = sys.argv[-1]
 # 进行实例化,从而达到“传递”对象的目的
 print(eval(student_obj))
main()

方法二:使用 pickle 和 base64 模块

这种方法采用的思路描述如下:

     1、启动脚本:pickle 模块的 dumps 方法可以将一个 Python 对象序列化成字节串;

     2、启动脚本:base64 模块的 encodebytes 方法可以将二进制的字节串编码为字符串;

     3、被启动脚本:base64 模块的 decodebytes 方法用于将使用 base64 编码的字符串转换成为 pickle 模块 dumps 后的字节串;

      4、被启动脚本:pickle 模块的 loads 方法将上一步的字节串转换成对象实例。

看起来上述过程似乎挺麻烦的,但是通常只需要两行关键代码就可以解决问题了,不过我们在这儿给封装到函数中了。

函数的代码编写如下:

def pickle_dumps_to_str(obj):
 try:
  return base64.encodebytes(pickle.dumps(obj)).decode()
 except pickle.PicklingError:
  pass
def pickle_loads_from_str(obj_str):
 try:
  return pickle.loads(base64.decodebytes(obj_str.encode()))
 except pickle.UnpicklingError:
  pass

下面,我们来看看怎么借助上述两个函数在命令行中传递实例化后的 Student 对象。

启动代码改写成下面这样:

def start_script():
 student = Student()
 student.name = 'Mary'
 # 此时传递的将是序列化后的 Student 对象实例(注意和使用 `eval` 的区别)
 commands = ['python3', '/home/chris/Projects/Python/movie_wisdom/script.py',
    pickle_dumps_to_str(student)]
 subprocess.call(commands)

被启动的脚本代码改写如下:

def main():
 student_obj = sys.argv[-1]
 # 载入 Student 对象实例
 print(pickle_loads_from_str(student_obj))

总结

以上就是这篇文章的全部内容了,其实关于这种需要在参数中传递实例化后的对象的方法不仅限于此,不过这应该算是比较特殊的一种应用情景了吧。如果大家有更好的方法,还望有大神指点。希望这篇文章对有需要的朋友们能有所帮助。

Python 相关文章推荐
Python中使用Flask、MongoDB搭建简易图片服务器
Feb 04 Python
Python中encode()方法的使用简介
May 18 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
Jul 30 Python
PyQt5利用QPainter绘制各种图形的实例
Oct 19 Python
python 动态加载的实现方法
Dec 22 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
Feb 11 Python
Python实现简单查找最长子串功能示例
Feb 26 Python
python、Matlab求定积分的实现
Nov 20 Python
解决Jupyter NoteBook输出的图表太小看不清问题
Apr 16 Python
使用Python matplotlib作图时,设置横纵坐标轴数值以百分比(%)显示
May 16 Python
10个python爬虫入门实例(小结)
Nov 01 Python
Python logging自定义字段输出及打印颜色
Nov 30 Python
Python 性能优化技巧总结
Nov 01 #Python
python字典多键值及重复键值的使用方法(详解)
Oct 31 #Python
浅谈django中的认证与登录
Oct 31 #Python
python 把数据 json格式输出的实例代码
Oct 31 #Python
python中json格式数据输出的简单实现方法
Oct 31 #Python
python并发编程之多进程、多线程、异步和协程详解
Oct 28 #Python
微信 用脚本查看是否被微信好友删除
Oct 28 #Python
You might like
一些常用的php简单命令代码集锦
2007/09/24 PHP
Zend Studio 无法启动的问题解决方法
2008/12/04 PHP
PHP中4种常用的抓取网络数据方法
2015/06/04 PHP
php+croppic.js实现剪切上传图片功能
2018/08/14 PHP
PHP工厂模式的日常使用
2019/03/20 PHP
Javascript优化技巧(文件瘦身篇)
2008/01/28 Javascript
JS 页面自动加载函数(兼容多浏览器)
2009/05/18 Javascript
js实现网站首页图片滚动显示
2013/02/04 Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
2013/10/20 Javascript
js数值和和字符串进行转换时可以对不同进制进行操作
2014/03/05 Javascript
基于javascript实现图片懒加载
2016/01/05 Javascript
js HTML5多媒体影音播放
2016/10/17 Javascript
Bootstrap CSS组件之下拉菜单(dropdown)
2016/12/17 Javascript
JavaScript中立即执行函数实例详解
2017/11/04 Javascript
基于JavaScript实现简单的音频播放功能
2018/01/07 Javascript
从零开始搭建一个react项目开发
2018/02/09 Javascript
Javascript的console['']常用输入方法汇总
2018/04/26 Javascript
nodejs使用async模块同步执行的方法
2019/03/02 NodeJs
微信小程序停止其他视频播放当前视频的实例代码
2019/12/25 Javascript
html中创建并调用vue组件的几种方法汇总
2020/11/17 Javascript
在Python中关于中文编码问题的处理建议
2015/04/08 Python
Python版名片管理系统
2018/11/30 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
2019/05/07 Python
selenium获取当前页面的url、源码、title的方法
2019/06/12 Python
基于Python的Post请求数据爬取的方法详解
2019/06/14 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
python对文件的操作方法汇总
2020/02/28 Python
使用K.function()调试keras操作
2020/06/17 Python
Win10环境中如何实现python2和python3并存
2020/07/20 Python
Python设计密码强度校验程序
2020/07/30 Python
利用CSS3的flexbox实现水平垂直居中与三列等高布局
2016/09/12 HTML / CSS
光盘行动倡议书
2014/02/02 职场文书
2014年乡镇妇联工作总结
2014/12/02 职场文书
司机岗位职责范本
2015/04/10 职场文书
2016圣诞节贺卡寄语
2015/12/07 职场文书
优化Mysql查询的示例
2022/04/26 MySQL