前言:
为什么有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
执行结果:
结语
如果有更好的方式,麻烦留言,这样在传递参数的过程中少了很多解析工作.当然这里仅作为在运维编写脚本时候常用到,也不失为一种学习字符串拆解的实际例子
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。