1

前言:

为什么有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

执行结果:

clipboard.png

结语

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


青叶
452 声望43 粉丝