利用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中MySQLdb模块用法实例
Nov 10 Python
Python使用MYSQLDB实现从数据库中导出XML文件的方法
May 11 Python
python 网络爬虫初级实现代码
Feb 27 Python
横向对比分析Python解析XML的四种方式
Mar 30 Python
python机器学习之KNN分类算法
Aug 29 Python
python判断文件夹内是否存在指定后缀文件的实例
Jun 10 Python
python 实现识别图片上的数字
Jul 30 Python
深入学习python多线程与GIL
Aug 26 Python
Python通过Tesseract库实现文字识别
Mar 05 Python
Python常用外部指令执行代码实例
Nov 05 Python
python3实现名片管理系统(控制台版)
Nov 29 Python
在Python中如何使用yield
Jun 07 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
mysql 中InnoDB和MyISAM的区别分析小结
2008/04/15 PHP
PHP 文件缓存的性能测试
2010/04/25 PHP
PHP 验证码的实现代码
2011/07/17 PHP
PHP学习散记_编码(json_encode 中文不显示)
2011/11/10 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
2015/06/17 PHP
PHP读取文件内容的五种方式
2015/12/28 PHP
PHP微信开发之有道翻译
2016/06/23 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
2019/10/30 PHP
探索Emberjs制作一个简单的Todo应用
2012/11/07 Javascript
jquery 构造函数在表单提交过程中修改数据
2015/05/25 Javascript
如何提高数据访问速度
2016/12/26 Javascript
bootstrap3 dialog 更强大、更灵活的模态框
2017/04/20 Javascript
vue-cli项目无法用本机IP访问的解决方法
2018/09/20 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
2018/12/06 Javascript
JavaScript回调函数callback用法解析
2020/01/14 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
[01:04:06]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第一局
2016/02/26 DOTA
python中string模块各属性以及函数的用法介绍
2016/05/30 Python
详解Python的collections模块中的deque双端队列结构
2016/07/07 Python
详解 Python 读写XML文件的实例
2017/08/02 Python
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
Python socket实现的简单通信功能示例
2018/08/21 Python
解决python打不开文件(文件不存在)的问题
2019/02/18 Python
python 同时读取多个文件的例子
2019/07/16 Python
Python搭建HTTP服务过程图解
2019/12/14 Python
Python如何基于selenium实现自动登录博客园
2019/12/16 Python
python实现密码强度校验
2020/03/18 Python
使用pyplot.matshow()函数添加绘图标题
2020/06/16 Python
python读写数据读写csv文件(pandas用法)
2020/12/14 Python
将一个数的从第5位开始的7个数取出,其余位置0
2016/05/26 面试题
养牛场项目建议书
2014/05/13 职场文书
群众路线调研报告范文
2014/11/03 职场文书
家长通知书家长意见
2015/06/03 职场文书
幼儿园毕业典礼家长致辞
2015/07/29 职场文书
获奖感言一句话
2015/07/31 职场文书
《中国机长》观后感:敬畏生命,敬畏职责
2019/11/12 职场文书