我有两个文件,一个是.py文件,另一个是.yml文件,如图所示。在.py文件中我使用的是.yml文件中定义的所有变量。现在我正在寻找一个解决方案,关于如何传递这个.yml文件或如何调用或使用.yml文件中的变量到.py文件。我还在图像中标记了我的问题,以帮助理解我的问题。
任何建议都会非常有帮助。
由于
- >以下是abcd.py文件
# abcd.py
import pexpect
import os
import yaml
from yaml import load
from pexpect import pxssh
import pdb
with open('/home/asdf/Desktop/test.yml', 'rb') as f:
var=yaml.load(f.read())
def example(gw_user,gw_password,gw_host):
child = pexpect.spawn("ssh"+" "+gw_user+"@"+gw_host,timeout=30)
child.expect('password')
child.sendline(gw_password)
#child.expect(self.gw_prompt)
print 'connection established'
child.expect('$')
child.sendline('cd /usr/local/lib/python2.7/dist-packages/ostinato/')
child.expect('ostinato')
child.sendline('python example.py')
print 'establishing connectivity with ostinato'
child.expect('127.0.0.1')
child.sendline('10.0.0.3')
child.expect('Tx')
child.sendline('1')
child.expect('Rx')
child.sendline('1')
child.expect('$')
child.sendline('exit')
child.interact()
#return self.gw_user
#pdb.set_trace()
answer=example(var[Username],var[Userpassword],var[Hostname])
print (answer)
- >下面是test.yml文件
---
- Username:
- xyz
- Userpassword:
- ubuntu
- Hostname:
- 10.0.0.3
还附上截图,以便更好地理解我的问题。
答案 0 :(得分:2)
由于YAML文档的结构,yaml.load()
返回字典列表:
with open('test.yml') as f:
var = yaml.load(f)
>>> var
[{'Username': ['xyz']}, {'Userpassword': ['ubuntu']}, {'Hostname': ['10.0.0.3']}]
这不是最有用的数据结构;不仅有单键字典列表,而且值本身是必须索引以获取其内容的列表。单个字典会更方便,因此,如果可以,您可以将YAML更改为:
---
Username: xyz
Userpassword: ubuntu
Hostname: 10.0.0.3
代表一个字典:
>>> var
{'Username': 'xyz', 'Userpassword': 'ubuntu', 'Hostname': '10.0.0.3'}
现在很容易将这些值传递给您的函数:
answer = example(var['Username'], var['Userpassword'], var['Hostname'])
如果您无法更改YAML文件,那么您可以先从数据中创建一个字典,然后使用它来调用上述函数:
with open('test.yml') as f:
var = yaml.load(f)
var = {k:v[0] for d in var for k,v in d.items()}
answer = example(var['Username'], var['Userpassword'], var['Hostname'])
这里的行var = {k:v[0] for d in var for k,v in d.items()}
是一个字典理解,它将单键字典列表转换为单个多键字典。