我有以下两个文件,一个是 .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)
Run Code Online (Sandbox Code Playgroud)
-> 下面是 test.yml 文件
---
- Username:
- xyz
- Userpassword:
- ubuntu
- Hostname:
- 10.0.0.3
Run Code Online (Sandbox Code Playgroud)
还附在下面的屏幕截图中,以便更好地理解我的问题。
由于 YAML 文档的结构,yaml.load()返回字典列表:
with open('test.yml') as f:
var = yaml.load(f)
>>> var
[{'Username': ['xyz']}, {'Userpassword': ['ubuntu']}, {'Hostname': ['10.0.0.3']}]
Run Code Online (Sandbox Code Playgroud)
这不是最有用的数据结构;不仅有单键字典的列表,而且值本身也是必须被索引以获取其内容的列表。单个字典会更方便,因此,如果可以,您可以将 YAML 更改为:
---
Username: xyz
Userpassword: ubuntu
Hostname: 10.0.0.3
Run Code Online (Sandbox Code Playgroud)
代表单个字典:
>>> var
{'Username': 'xyz', 'Userpassword': 'ubuntu', 'Hostname': '10.0.0.3'}
Run Code Online (Sandbox Code Playgroud)
现在很容易将这些值传递给您的函数:
answer = example(var['Username'], var['Userpassword'], var['Hostname'])
Run Code Online (Sandbox Code Playgroud)
如果您无法更改 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'])
Run Code Online (Sandbox Code Playgroud)
这里的行var = {k:v[0] for d in var for k,v in d.items()}是一个字典推导式,它将单键字典列表转换为一个多键字典。