我在python脚本中有2个函数。
第一个使用WHERE子句从数据库获取数据,但第二个函数使用此数据并遍历结果以下载文件。
我可以将结果作为元组打印出来吗?
[('mmpc',), ('vmware',), ('centos',), ('redhat',), ('postgresql',), ('drupal',)]
但我需要将每个元素作为字符串迭代,以便下载函数可以将其附加到response
变量的URL
以下是包含以下功能的下载脚本的代码: -
import requests
import eventlet
import os
import sqlite3
# declare the global variable
active_vuln_type = None
# Get the active vulnerability sets
def GetActiveVulnSets() :
# make the variable global
global active_vuln_type
active_vuln_type = con = sqlite3.connect('data/vuln_sets.db')
cur = con.cursor()
cur.execute('''SELECT vulntype FROM vuln_sets WHERE active=1''')
active_vuln_type = cur.fetchall()
print(active_vuln_type)
return(active_vuln_type)
# return str(active_vuln_type)
def ExportList():
vulnlist = list(active_vuln_type)
activevulnlist = ""
for i in vulnlist:
activevulnlist = str(i)
basepath = os.path.dirname(__file__)
filepath = os.path.abspath(os.path.join(basepath, ".."))
response = requests.get('https://vulners.com/api/v3/archive/collection/?type=' + activevulnlist)
with open(filepath + '/vuln_files/' + activevulnlist + '.zip', 'wb') as f:
f.write(response.content)
f.close()
return activevulnlist + " - " + str(os.path.getsize(filepath + '/vuln_files/' + activevulnlist + '.zip'))
目前它创建了一个损坏的.zip作为('mmpc',).zip
所以它不是真正的文件,它是mmpc.zip的第一个,但它似乎没有迭代遍历列表,因为它只创建了来自数据库的第一个结果的zip文件,而不是print(i)
返回[('mmpc',), ('vmware',), ('centos',), ('redhat',), ('postgresql',), ('drupal',)]
由于脚本认为它正在运行,因此没有回溯。
答案 0 :(得分:1)
以下修复了两个问题:1。将查询输出转换为可迭代的字符串; 2.用return
函数替换print
语句,以便for-loop
不会结束过早。
我还冒昧地删除了一些冗余,例如关闭with
语句中的文件并毫无意义地将list
转换为list
。我也在GetActiveVulnSets
函数中调用ExportList
。这样就不需要在函数定义之外调用GetActiveVulnSets
。
import requests
import eventlet
import os
import sqlite3
# declare the global variable
active_vuln_type = None
# Get the active vulnerability sets
def GetActiveVulnSets() :
# make the variable global
global active_vuln_type
active_vuln_type = con = sqlite3.connect('data/vuln_sets.db')
cur = con.cursor()
cur.execute('''SELECT vulntype FROM vuln_sets WHERE active=1''')
active_vuln_type = [x[0] for x in cur]
print(active_vuln_type)
return(active_vuln_type)
# return str(active_vuln_type)
def ExportList():
GetActiveVulnSets()
activevulnlist = ""
for i in active_vuln_type:
activevulnlist = str(i)
basepath = os.path.dirname(__file__)
filepath = os.path.abspath(os.path.join(basepath, ".."))
response = requests.get('https://vulners.com/api/v3/archive/collection/?type=' + activevulnlist)
with open(filepath + '/vuln_files/' + activevulnlist + '.zip', 'wb') as f:
f.write(response.content)
print(activevulnlist + " - " + str(os.path.getsize(filepath + '/vuln_files/' + activevulnlist + '.zip')))
虽然这可以解决您遇到的问题,但我建议您使用参数编写函数。这样,你就知道每个函数应该作为参数接受什么以及它作为输出吐出的内容。实质上,如果可以,请避免使用global
变量。它们很难调试,在许多用例中坦率地说是不必要的。
我希望这会有所帮助。