利用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实现方法
Nov 18 Python
在Python中处理列表之reverse()方法的使用教程
May 21 Python
全面解析Python的While循环语句的使用方法
Oct 13 Python
Python中的Descriptor描述符学习教程
Jun 02 Python
Python遍历文件夹和读写文件的实现代码
Aug 28 Python
Python实现的径向基(RBF)神经网络示例
Feb 06 Python
Python实现的redis分布式锁功能示例
May 29 Python
python:按行读入,排序然后输出的方法
Jul 20 Python
python实现一个点绕另一个点旋转后的坐标
Dec 04 Python
Python模块zipfile原理及使用方法详解
Aug 04 Python
python使用建议与技巧分享(二)
Aug 17 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
Oct 18 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
1982年日本摄影师镜头下的中国孩子 那无忧无虑的童年
2020/03/12 杂记
php addslashes及其他清除空格的方法是不安全的
2012/01/25 PHP
Smarty局部缓存的几种方法简介
2014/06/17 PHP
php+xml结合Ajax实现点赞功能完整实例
2015/01/30 PHP
php session 写入数据库
2016/02/13 PHP
PHP使用mysqli操作MySQL数据库的简单方法
2017/02/04 PHP
PHP实现git部署的方法教程
2017/12/19 PHP
一个JS翻页效果
2007/07/23 Javascript
javascript new一个对象的实质
2010/01/07 Javascript
获取客户端网卡MAC地址和IP地址实现JS代码
2013/03/17 Javascript
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
2013/06/28 Javascript
遍历DOM对象内的元素属性示例代码
2014/02/08 Javascript
编写高效jQuery代码的4个原则和5个技巧
2014/04/24 Javascript
jQuery判断复选框是否勾选的原理及示例
2014/05/21 Javascript
JS绘制生成花瓣效果的方法
2015/08/05 Javascript
原生js实现简单的链式操作
2017/07/04 Javascript
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
JavaScript选择排序算法原理与实现方法示例
2018/08/06 Javascript
小小聊天室Python代码实现
2016/08/17 Python
CentOS中升级Python版本的方法详解
2017/07/10 Python
Python实现发送QQ邮件的封装
2017/07/14 Python
Python栈算法的实现与简单应用示例
2017/11/01 Python
Python解决走迷宫问题算法示例
2018/07/27 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
2019/02/21 Python
python实现证件照换底功能
2019/08/20 Python
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
国际奢侈品品牌童装购物网站:Designer Childrenswear
2019/05/08 全球购物
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
初中班主任评语大全
2014/04/24 职场文书
逃课检讨书范文
2015/05/06 职场文书
关于幸福的感言
2015/08/03 职场文书
员工规章制度范本
2015/08/07 职场文书
《学会生存》读后感3篇
2019/12/09 职场文书
基于Redis的List实现特价商品列表功能
2021/08/30 Redis
MySQL的存储过程和相关函数
2022/04/26 MySQL