利用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实现备份文件实例
Sep 16 Python
python中实现定制类的特殊方法总结
Sep 28 Python
python获取从命令行输入数字的方法
Apr 29 Python
python可视化实现代码
Jan 15 Python
Python 运行.py文件和交互式运行代码的区别详解
Jul 02 Python
python数据预处理之数据标准化的几种处理方式
Jul 17 Python
基于python 微信小程序之获取已存在模板消息列表
Aug 05 Python
python的faker库用法
Nov 28 Python
django多种支付、并发订单处理实例代码
Dec 13 Python
python3 配置logging日志类的操作
Apr 08 Python
Python函数中apply、map、applymap的区别
Nov 27 Python
Python中request的基本使用解决乱码问题
Apr 12 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
国王的咖啡这么大来头,名字的由来是什么
2021/03/03 咖啡文化
php Ajax乱码
2008/04/09 PHP
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
2012/01/16 PHP
关于初学PHP时的知识积累总结
2013/06/07 PHP
关于svn冲突的解决方法
2013/06/21 PHP
php常用的url处理函数总结
2014/11/19 PHP
在Windows XP下安装Apache+MySQL+PHP环境
2015/02/22 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
2016/10/28 PHP
如何利用PHP实现上传图片功能详解
2020/09/24 PHP
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
微信JSSDK上传图片
2015/08/23 Javascript
详解JavaScript中的事件流和事件处理程序
2016/05/20 Javascript
jQuery post数据至ashx实例详解
2016/11/18 Javascript
javascript实现获取图片大小及图片等比缩放的方法
2016/11/24 Javascript
vue双向绑定的简单实现
2016/12/22 Javascript
Angular客户端请求Rest服务跨域问题的解决方法
2017/09/19 Javascript
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
2018/01/20 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
2018/02/22 Javascript
node中的session的具体使用
2018/09/14 Javascript
举例讲解Python中的死锁、可重入锁和互斥锁
2015/11/05 Python
5款非常棒的Python工具
2018/01/05 Python
python实现关键词提取的示例讲解
2018/04/28 Python
初探利用Python进行图文识别(OCR)
2019/02/26 Python
Python函数装饰器常见使用方法实例详解
2019/03/30 Python
Django文件存储 默认存储系统解析
2019/08/02 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
Python通过队列来实现进程间通信的示例
2020/10/14 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
2021/01/26 Python
requests在python中发送请求的实例讲解
2021/02/17 Python
匈牙利超级网上商店和优惠:Alza.hu
2019/12/17 全球购物
Lucene推荐的分页方式是什么?
2015/12/07 面试题
一份创业计划书范文
2014/02/08 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
mysql的MVCC多版本并发控制的实现
2021/04/14 MySQL
MySQL如何构建数据表索引
2021/05/13 MySQL