利用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局部赋值的规则
Mar 07 Python
Python中的引用和拷贝浅析
Nov 22 Python
Python实现简单的文件传输与MySQL备份的脚本分享
Jan 03 Python
浅谈python中的实例方法、类方法和静态方法
Feb 17 Python
深入理解Python中的*重复运算符
Oct 28 Python
Python中elasticsearch插入和更新数据的实现方法
Apr 01 Python
python对csv文件追加写入列的方法
Aug 01 Python
Django分组聚合查询实例分享
Apr 29 Python
win10安装python3.6的常见问题
Jul 01 Python
pytorch随机采样操作SubsetRandomSampler()
Jul 07 Python
总结Pyinstaller的坑及终极解决方法(小结)
Sep 21 Python
解决pip安装的第三方包在PyCharm无法导入的问题
Oct 15 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常用技术文之文件操作和目录操作总结
2014/09/27 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
PHP设计模式之观察者模式实例
2016/02/22 PHP
php图像验证码生成代码
2017/06/08 PHP
基于laravel where的高级使用方法
2019/10/10 PHP
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
浅析jquery的js图表组件highcharts
2014/03/06 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
常用的JavaScript WEB操作方法分享
2015/02/28 Javascript
javascript实现继承的简单实例
2015/07/26 Javascript
使用vue.js制作分页组件
2016/06/27 Javascript
Vue.js展示AJAX数据简单示例讲解
2017/03/29 Javascript
关于vue.js过渡css类名的理解(推荐)
2017/04/10 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
2017/04/10 jQuery
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
JS中利用FileReader实现上传图片前本地预览功能
2018/03/02 Javascript
node puppeteer(headless chrome)实现网站登录
2018/05/09 Javascript
javacript replace 正则取字符串中的值并替换【推荐】
2018/09/13 Javascript
axios如何利用promise无痛刷新token的实现方法
2019/08/27 Javascript
微信小程序全局变量GLOBALDATA的定义和调用过程解析
2019/09/23 Javascript
Python数据类型学习笔记
2016/01/13 Python
python中zip()方法应用实例分析
2016/04/16 Python
Python使用QRCode模块生成二维码实例详解
2017/06/14 Python
python3.6 如何将list存入txt后再读出list的方法
2019/07/02 Python
关于tf.matmul() 和tf.multiply() 的区别说明
2020/06/18 Python
CSS3实现红包抖动效果
2020/12/23 HTML / CSS
SHEIN香港:价格实惠的女性时尚服装
2018/08/14 全球购物
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
园艺师求职信
2014/03/10 职场文书
股权投资意向书
2014/04/01 职场文书
关于爱国的演讲稿
2014/05/07 职场文书
当幸福来敲门英文观后感
2015/06/01 职场文书
小学英语新课改心得体会
2016/01/22 职场文书
2016大学先进团支部事迹材料
2016/03/01 职场文书
Python自动化爬取天眼查数据的实现
2021/06/15 Python
如何使用 resize 实现图片切换预览功能
2021/08/23 HTML / CSS