我正在尝试从SQL Server中提取设备并对这些设备执行ping测试。
这是我到目前为止编写的代码:
import subprocess
import pyodbc
data = {}
def list():
conn = pyodbc.connect("Driver={SQL Server};"
"Server=sqlserver;"
"Database=database;"
"Trusted_Connection=yes;")
cursor = conn.cursor()
cursor.execute('''
SELECT TOP 10 Names FROM sqldatabasetable
''')
results = cursor.fetchall()
for result in results:
return result.Names
#print(result.Names)
conn.close()
def pingtest():
response = subprocess.Popen(['ping.exe', list()], stdout=subprocess.PIPE).communicate()[0]
response = response.decode()
if 'bytes=32' in response:
status = 'Up'
return status
else:
status = 'Down'
return status
print(list())
print(pingtest())
#print(pingtest(), list())
当我在print(result.Names)
函数下仅打印list()
时,我得到10台设备,但是当我将它们返回到list()
并迭代pingtest() function
中的设备时,我得到了仅第一个设备。我知道我缺少一些显而易见的东西。这应该是一个简单的答案,但是如果有必要,我无法确切找出应该在哪里循环。
这会将设备名称和ping状态打印为:
['devicename1' , 'devicename2', 'devicename3', 'devicename4', 'devicename5']
Down
我期望像这样,按照我编写print
命令的方式进行操作:
devicename1
Ping status of devicename1
devicename2
Ping status of devicename2
and so on...
答案 0 :(得分:3)
当您在print
循环中for result in results:
时,您的代码将继续遍历检索到的每一行。但是,当您将print
替换为return
时,则第一次通过循环return
会立即退出list()
函数,因此您只能从第一个获取值行。
如果您希望list()
返回所有行中的值,则可以用列表理解(如
return [result.Names for result in results]
答案 1 :(得分:2)
您可以使pingtest
接受device_name参数并传递给ping.exe
。因此,您可以先获取list()
,然后对其进行迭代,然后在该循环中将每个设备传递给pingtest
。
import subprocess
import pyodbc
data = {}
def mylist():
conn = pyodbc.connect("Driver={SQL Server};"
"Server=sqlserver;"
"Database=database;"
"Trusted_Connection=yes;")
cursor = conn.cursor()
cursor.execute('''
SELECT TOP 10 Names FROM sqldatabasetable
''')
results = cursor.fetchall()
conn.close()
return [result.Names for result in results]
def pingtest(device):
response = subprocess.Popen(['ping.exe', device], stdout=subprocess.PIPE).communicate()[0]
response = response.decode()
if 'bytes=32' in response:
status = 'Up'
return status
else:
status = 'Down'
return status
devices = mylist()
for device in devices:
print(device)
print(pingtest(device))