如何使用.yml文件中的变量到.py文件

时间:2016-07-27 23:27:04

标签: python yaml

我有两个文件,一个是.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

还附上截图,以便更好地理解我的问题。

enter image description here

1 个答案:

答案 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()}是一个字典理解,它将单键字典列表转换为单个多键字典。