利用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 相关文章推荐
Django1.7+python 2.78+pycharm配置mysql数据库
Oct 09 Python
Python标准库sched模块使用指南
Jul 06 Python
Python实现Pig Latin小游戏实例代码
Feb 02 Python
python3+PyQt5+Qt Designer实现扩展对话框
Apr 20 Python
python 堆和优先队列的使用详解
Mar 05 Python
Python实现TCP通信的示例代码
Sep 09 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
Mar 30 Python
python boto和boto3操作bucket的示例
Oct 30 Python
python3中确保枚举值代码分析
Dec 02 Python
pycharm + django跨域无提示的解决方法
Dec 06 Python
Python非单向递归函数如何返回全部结果
Dec 18 Python
使用Djongo模块在Django中使用MongoDB数据库
Jun 20 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』PHP截断函数mb_substr()使用介绍
2013/04/22 PHP
php版本的cron定时任务执行器使用实例
2014/08/19 PHP
PHP封装的page分页类定义与用法完整示例
2018/12/24 PHP
php实现映射操作实例详解
2019/10/02 PHP
javascript 节点遍历函数
2010/03/28 Javascript
JQuery $.each遍历JavaScript数组对象实例
2014/09/01 Javascript
JS轮播图中缓动函数的封装
2020/11/25 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
教你5分钟学会用requirejs(必看篇)
2017/07/25 Javascript
vue bus全局事件中心简单Demo详解
2018/02/26 Javascript
详解关于微信setData回调函数中的坑
2019/02/18 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
2020/06/06 jQuery
[04:03]DOTA2英雄梦之声_第02期_风暴之灵
2014/06/30 DOTA
[02:17]TI4西雅图DOTA2前线报道 啸天mik夫妻档解说
2014/07/08 DOTA
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
python 从远程服务器下载东西的代码
2013/02/10 Python
Python中类型关系和继承关系实例详解
2015/05/25 Python
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
Pytorch实现GoogLeNet的方法
2019/08/18 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
2019/09/11 Python
CSS3中currentColor关键字的妙用
2016/02/27 HTML / CSS
Uber Eats台湾:寻找附近提供送餐服务的餐厅
2018/05/07 全球购物
WatchShop法国:英国排名第一的独立手表零售商
2020/02/17 全球购物
KEEN美国官网:美国人气户外休闲鞋品牌
2021/03/09 全球购物
Java中会存在内存泄漏吗,请简单描述
2016/12/22 面试题
计算机开发个人求职信范文
2013/09/26 职场文书
党支部书记先进事迹
2014/01/17 职场文书
展会邀请函范文
2014/01/26 职场文书
小班重阳节活动方案
2014/02/08 职场文书
护士岗前培训自我评鉴
2014/02/28 职场文书
卖房协议书
2014/04/11 职场文书
协议书怎么写
2014/04/21 职场文书
清洁工岗位职责
2015/02/13 职场文书
2014年个人总结范文
2015/03/09 职场文书
公司晚会主持词
2019/04/17 职场文书