资讯专栏INFORMATION COLUMN

python调用python脚本时参数的传递

yankeys / 1968人阅读

摘要:前言为什么有调用脚本呢直接不就行了吗这里主要是用于远程调用时这种调用在运维场景中是比较多的,类似下面这样的调用远程调用这里有个问题就是传递较多参数时如何传递比如传递字典传递列表等我们可以发现,如果直接传递,往往传过去后不能很好的解析因为这

前言:

为什么有python调用python脚本呢?直接import不就行了吗?
这里主要是用于远程调用时,这种调用在运维场景中是比较多的,类似下面这样的调用

   server.py  远程调用->   agent.py

这里有个问题,就是传递较多参数时,如何传递,比如传递字典,传递列表等,
我们可以发现,如果直接传递,往往传过去后不能很好的解析,因为这样直接调用,
agent.py在使用sys.argv解析时,获得的是列表,列表里面是字符串

如何解决?

解决方法就是将要传递的参数拆解成字符串,以特殊字符隔开,agen.py解析时候,再拆解回来

实例

1、server.py

#-*- coding:utf8 -*- 
import paramiko
script_path = "/data/test"

# 需要传递的参数
arg_a = 1000           #数字
arg_b = "anymore"      #字符串
arg_c = ["192.168.0.1","192.168.0.2","192.168.0.3"] #列表
arg_d = {"a":"5","b":"10","c":"11"}   #字典

# 将数字变为字符串
arg_a = str(arg_a)

# 拆解列表arg_c
arg_c_str = ",".join(arg_c)

# 拆解字典arg_d
arg_d_list = []
for k,v in arg_d.items():
    tmp_str = "%s:%s"%(k,v)
    arg_d_list.append(tmp_str)
arg_d_str = ",".join(arg_d_list)

# 组合传递参数
args = "{0}|{1}|{2}|{3}".format(
    arg_a,
    arg_b,
    arg_c_str,
    arg_d_str
)
# 这里输出的内容为:
#1000|anymore|192.168.0.1,192.168.0.2,192.168.0.3|a:5,c:11,b:10
print args


command = "python {0}/a.py "{1}"".format(
    script_path,
    args
)
s = paramiko.SSHClient()
s.load_system_host_keys()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
s.connect("ssh host", "ssh port", "ssh user", "ssh password", timeout=15)
stdin,stdout,stderr = s.exec_command(command)
stdout,stderr = stdout.read(),stderr.read()
    
print stdout, stderr

# 远程调用一般使用paramiko,这里使用commands演示
status, result = commands.getstatusoutput(command)

2、agent.py

#-*- coding:utf8 -*-

import sys

args = sys.argv[1]
args_list = args.split("|")

# 处理数字参数
arg_a = int(args_list[0])

# 处理字符串参数
arg_b = str(args_list[1])

# 处理列表参数
arg_c_list = args_list[2].split(",")

# 处理字典参数
arg_d_list = args_list[3].split(",")
arg_d_dic = {}
for i in arg_d_list:
    tmp = i.split(":")
    arg_d_dic[tmp[0]] = tmp[1]

print arg_a
print arg_b
print arg_c_list
print arg_d_dic

执行结果:

结语

如果有更好的方式,麻烦留言,这样在传递参数的过程中少了很多解析工作.当然这里仅作为在运维编写脚本时候常用到,也不失为一种学习字符串拆解的实际例子

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44420.html

相关文章

  • Python和SQL Server 2017强大功能

    摘要:它主要是为了允许在中使用基于的机器学习,但是它可以与任何库或框架一起使用。已经通过启用服务器通过使用的机器学习服务在中执行脚本,添加到其高级分析扩展,现在称为机器学习服务。存储的实例必须安装具有的机器学习服务要在中使用执行脚本,应运行或。 Python和SQL Server 2017的强大功能 Python是SQL Server 2017的新功能。它主要是为了允许在SQLServer中...

    everfight 评论0 收藏0
  • 100 个基本 Python 面试问题第二部分(21-40)

    摘要:为我们提供了许多内置函数,例如并提供了创建用户定义函数的能力。会将该变量视为函数级作用域中的局部变量。回到目录中函数的用途是什么是中的内置函数之一。请注意,这种类型的参数语法不允许将命名参数传递给函数。函数接受一个称为的可选参数。 ...

    2450184176 评论0 收藏0
  • python模块之sys

    摘要:返回的信息特定于当前线程以及当前堆栈帧。出于某些原因,这个值可能无法计算,将返回返回安卓版本的构建时间,以整数表示。仅适用于安卓平台返回解释器的检查间隔。可操作此属性实现强制重新加载模块等。 sys模块提供对由解释器使用或维护的某些变量、与解释器交互的函数的访问接口。 sys.abiflags 在使用标准configure脚本构建python的POSIX系统上,该属性包含了PEP 31...

    csRyan 评论0 收藏0
  • Python-爬虫工程师-面试总结

    摘要:内存池机制提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。为了加速的执行效率,引入了一个内存池机制,用于管理对小块内存的申请和释放。 注:答案一般在网上都能够找到。1.对if __name__ == main的理解陈述2.python是如何进行内存管理的?3.请写出一段Python代码实现删除一个list里面的重复元素4.Python里面如何拷贝一个对象?...

    antz 评论0 收藏0
  • Blender Python API概述

    摘要:在交互式控制台中运行此操作时,您将看到视口更新。键入或粘贴到交互式控制台中。用户首选项加载项列表使用显示有关每个加载项的信息。最后两行仅用于测试这允许脚本直接在文本编辑器中运行以测试更改。 Blender Python API概述 本文档的目的是解释Python和Blender如何组合在一起,涵盖了一些在阅读API参考和示例脚本时可能不明显的功能。 Python in Blender ...

    魏宪会 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<