利用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脚本使得web页面上的代码高亮显示
Apr 24 Python
Python中shutil模块的学习笔记教程
Apr 04 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
Apr 11 Python
python批量替换多文件字符串问题详解
Apr 22 Python
Python排序算法之选择排序定义与用法示例
Apr 29 Python
Python虚拟环境的原理及使用详解
Jul 02 Python
redis数据库及与python交互用法简单示例
Nov 01 Python
Python函数的默认参数设计示例详解
Dec 01 Python
Python tkinter模版代码实例
Feb 05 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
Oct 12 Python
python实现快速文件格式批量转换的方法
Oct 16 Python
Python基于内置函数type创建新类型
Oct 22 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新手上路(二)
2006/10/09 PHP
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
2010/11/01 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
2014/06/30 PHP
php实现的IMEI限制的短信验证码发送类
2015/05/05 PHP
php post大量数据时发现数据丢失问题解决方法
2015/06/20 PHP
在 Laravel 中动态隐藏 API 字段的方法
2019/10/25 PHP
js字符编码函数区别分析
2008/06/05 Javascript
Flex通过JS获取客户端IP和计算机名的实例代码
2013/11/21 Javascript
JS常用函数使用指南
2014/11/23 Javascript
jQuery UI仿淘宝搜索下拉列表功能
2017/01/10 Javascript
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
jQuery实现的页面详情展开收起功能示例
2018/06/11 jQuery
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
javascript实现商品图片放大镜
2019/11/28 Javascript
[05:41]2014DOTA2西雅图国际邀请赛 小组赛7月10日TOPPLAY
2014/07/10 DOTA
在Python中实现贪婪排名算法的教程
2015/04/17 Python
python深度优先搜索和广度优先搜索
2018/02/07 Python
Python 查找字符在字符串中的位置实例
2018/05/02 Python
python 处理string到hex脚本的方法
2018/10/26 Python
Python3+Appium实现多台移动设备操作的方法
2019/07/05 Python
关于Pytorch的MLP模块实现方式
2020/01/07 Python
Python Tensor FLow简单使用方法实例详解
2020/01/14 Python
python selenium自动化测试框架搭建的方法步骤
2020/06/14 Python
卡骆驰英国官网:Crocs英国
2019/08/22 全球购物
面向对象设计的原则是什么
2013/02/13 面试题
毕业生求职推荐信
2013/11/04 职场文书
元旦联欢会感言
2014/03/04 职场文书
行政部工作岗位职责范本
2014/03/05 职场文书
学习雷锋寄语大全
2014/04/11 职场文书
物业保安岗位职责
2014/07/02 职场文书
精神文明建设汇报材料
2014/12/24 职场文书
关于幸福的感言
2015/08/03 职场文书
公安忠诚教育心得体会
2016/01/23 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书
普希金的诗歌赏析(3首)
2019/08/20 职场文书