利用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 相关文章推荐
使用相同的Apache实例来运行Django和Media文件
Jul 22 Python
pycharm设置注释颜色的方法
May 23 Python
Python设计模式之迭代器模式原理与用法实例分析
Jan 10 Python
20行python代码实现人脸识别
May 05 Python
python之信息加密题目详解
Jun 26 Python
Python collections中的双向队列deque简单介绍详解
Nov 04 Python
Python基于模块Paramiko实现SSHv2协议
Apr 28 Python
深入了解Python 变量作用域
Jul 24 Python
Pycharm导入anaconda环境的教程图解
Jul 31 Python
基于Python pyecharts实现多种图例代码解析
Aug 10 Python
Python3读写ini配置文件的示例
Nov 06 Python
详解Python openpyxl库的基本应用
Feb 26 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后端方法)
2016/02/03 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
2019/05/29 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
2019/10/04 PHP
javascript 一些用法小结
2009/09/11 Javascript
js href的用法
2010/05/13 Javascript
基于jquery的动态创建表格的插件
2011/04/05 Javascript
js列举css中所有图标的实现代码
2011/07/04 Javascript
JS高级拖动技术 setCapture,releaseCapture
2011/07/31 Javascript
javascript实现动态模态绑定grid过程代码
2014/09/22 Javascript
JavaScript中的依赖注入详解
2015/03/18 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
2015/08/04 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
jquery实现点击变换导航样式的方法
2015/08/31 Javascript
使用impress.js制作幻灯片
2015/09/09 Javascript
jQuery实现的多滑动门,多选项卡效果代码
2016/03/28 Javascript
Node.js的基本知识简单汇总
2016/09/19 Javascript
[原创]JS基于FileSaver.js插件实现文件保存功能示例
2016/12/08 Javascript
JS获取浮动(float)元素的style.left值为空的快速解决办法
2017/02/19 Javascript
js实现Tab选项卡切换效果
2020/07/17 Javascript
angular6的响应式表单的实现
2018/10/10 Javascript
Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置
2019/05/27 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
JavaScript中window和document用法详解
2020/07/28 Javascript
python 多线程应用介绍
2012/12/19 Python
python从入门到精通(DAY 2)
2015/12/20 Python
python爬虫_自动获取seebug的poc实例
2017/08/05 Python
Python3的介绍、安装和命令行的认识(推荐)
2018/10/20 Python
Python提取支付宝和微信支付二维码的示例代码
2019/02/15 Python
python binascii 进制转换实例
2019/06/12 Python
python绘制多个子图的实例
2019/07/07 Python
Python3.7安装keras和TensorFlow的教程图解
2020/06/18 Python
Python如何读取文件中图片格式
2020/01/13 Python
优秀大学生的自我评价
2014/01/16 职场文书
理想点亮人生演讲稿
2014/05/21 职场文书
邀请函格式范文
2015/02/02 职场文书
水电工程师岗位职责
2015/02/13 职场文书