利用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简单检测文本类型的2种方法【基于文件头及cchardet库】
Sep 18 Python
Python 元类实例解析
Apr 04 Python
python之消除前缀重命名的方法
Oct 21 Python
用python 实现在不确定行数情况下多行输入方法
Jan 28 Python
opencv导入头文件时报错#include的解决方法
Jul 31 Python
redis数据库及与python交互用法简单示例
Nov 01 Python
Python实现栈和队列的简单操作方法示例
Nov 29 Python
Python爬虫HTPP请求方法有哪些
Jun 03 Python
容易被忽略的Python内置类型
Sep 03 Python
python pymysql库的常用操作
Oct 16 Python
Python绘制分类图的方法
Apr 20 Python
Pytorch中的学习率衰减及其用法详解
Jun 05 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
模拟OICQ的实现思路和核心程序(三)
2006/10/09 PHP
ADODB结合SMARTY使用~超级强
2006/11/25 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
2019/07/24 PHP
用js模拟JQuery的show与hide动画函数代码
2010/09/20 Javascript
鼠标经过显示二级菜单js特效
2013/08/13 Javascript
使用AngularJS编写较为优美的JavaScript代码指南
2015/06/19 Javascript
drag-and-drop实现图片浏览器预览
2015/08/06 Javascript
AngularJS基础 ng-copy 指令实例代码
2016/08/01 Javascript
p5.js入门教程之鼠标交互的示例
2018/03/16 Javascript
layui 上传图片 返回图片地址的方法
2019/09/26 Javascript
JS实现随机抽取三人
2019/11/06 Javascript
JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
2020/02/12 Javascript
[10:04]国际邀请赛采访专栏:DK.Farseer,mouz.Black^,采访员Josh专访
2013/08/05 DOTA
Python中的异常处理学习笔记
2015/01/28 Python
Python随机数random模块使用指南
2016/09/09 Python
Python实现购物车程序
2018/04/16 Python
python 实现将多条曲线画在一幅图上的方法
2019/07/07 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
python实现拉普拉斯特征图降维示例
2019/11/25 Python
Python三元运算与lambda表达式实例解析
2019/11/30 Python
Python3常见函数range()用法详解
2019/12/30 Python
澳大利亚最受欢迎的超级商场每日优惠:Catch
2020/11/17 全球购物
一份比较全的PHP面试题
2016/07/29 面试题
医院护理人员的自我评价分享
2013/10/04 职场文书
中药专业大学生医药工作求职信
2013/10/25 职场文书
开会迟到检讨书
2014/01/08 职场文书
青蓝工程实施方案
2014/03/27 职场文书
导师工作推荐信范文
2014/05/17 职场文书
诉讼授权委托书
2014/10/15 职场文书
请客吃饭开场白
2015/06/01 职场文书
中秋节随笔
2015/08/15 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
Django+Celery实现定时任务的示例
2021/06/23 Python
python APScheduler执行定时任务介绍
2022/04/19 Python