利用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和shell变量互相传递的几种方法
Nov 20 Python
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
Jun 10 Python
Python实现将数据库一键导出为Excel表格的实例
Dec 30 Python
NumPy 如何生成多维数组的方法
Feb 05 Python
python读取txt文件,去掉空格计算每行长度的方法
Dec 20 Python
python3 selenium自动化 frame表单嵌套的切换方法
Aug 23 Python
Python 装饰器原理、定义与用法详解
Dec 07 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
May 04 Python
浅析Python 字符编码与文件处理
Sep 24 Python
如何利用Python matplotlib绘制雷达图
Dec 21 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
Feb 22 Python
python中使用 unittest.TestCase单元测试的用例详解
Aug 30 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
多人战的战术与战略
2020/03/04 星际争霸
PHP程序员编程注意事项
2008/04/10 PHP
php 在线打包_支持子目录
2008/06/28 PHP
PHP 获取MySQL数据库里所有表的实现代码
2011/07/13 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
2013/08/16 PHP
php关闭warning问题的解决方法
2016/05/17 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
Zend Framework分发器用法示例
2016/12/11 PHP
PHP中Trait及其应用详解
2017/02/14 PHP
php微信公众号开发之二级菜单
2018/10/20 PHP
PDO实现学生管理系统
2020/03/21 PHP
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
也说JavaScript中String类的replace函数
2011/09/22 Javascript
简单的Jquery遮罩层代码实例
2013/11/14 Javascript
javascript+canvas制作九宫格小程序
2014/12/28 Javascript
jQuery on()方法示例及jquery on()方法的优点
2015/08/27 Javascript
jQuery自适应轮播图插件Swiper用法示例
2016/08/24 Javascript
微信小程序商城项目之购物数量加减(3)
2017/04/17 Javascript
JS创建Tag标签的方法详解
2017/06/09 Javascript
详解Vue.js Mixins 混入使用
2017/09/15 Javascript
vue父组件向子组件动态传值的两种方法
2017/11/11 Javascript
JS获取input[file]的值并显示在页面的实现方法
2018/03/09 Javascript
vue.js实现的绑定class操作示例
2018/07/06 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
JS查找孩子节点简单示例
2019/07/25 Javascript
Python中还原JavaScript的escape函数编码后字符串的方法
2014/08/22 Python
Python使用SocketServer模块编写基本服务器程序的教程
2016/07/12 Python
详解Python 调用C# dll库最简方法
2019/06/20 Python
基于 Django 的手机管理系统实现过程详解
2019/08/16 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
2020/03/09 Python
《在山的那边》教学反思
2014/02/23 职场文书
党的群众路线教育实践活动总结报告
2014/04/28 职场文书
销售经理工作失职检讨书
2014/10/24 职场文书
监考失职检讨书
2015/01/26 职场文书
Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)
2021/11/17 Servers