python - Python程序没有被执行
问题描述
执行 python 程序时出现以下错误。有人可以帮我解决这个问题吗?
[root@saas-promethus linuxtest]# /usr/bin/python2 script_azure.py
Traceback (most recent call last):
File "script_azure.py", line 43, in <module>
with connect('HOST', 'user', 'password', 'db') as cur:
AttributeError: __exit__
蟒蛇代码:
import os, time, json
from itertools import groupby
from MySQLdb import connect
def refresh(cur):
# Fetch all rows.
cur.execute("SELECT azure_vm.PrivateIpAddress, azure_vm.VmName, azure_vm.Subnet, azure_vm.ResourceGroupName, azure_vm.VmSize, azure_vm.OsType, azure_vm.Region, azure_vm.subscriptionId, azure_vm.projectName, azure_vm.environmentName, azure_vm.departmentName, azure_vm.applicationName, azure_vm.costCenterName, azure_vm.costCenterCode, azure_app.app FROM azure_vm LEFT JOIN azure_app ON azure_vm.VmId = azure_app.VmId WHERE azure_vm.state != 'VM Deleted' and azure_vm.Provisioned = 'api_azure' and azure_app.status != 'failed' and azure_app.status != 'removed'")
tgs = []
# Group all instances by their job and zone values.
for key, vals in groupby(cur.fetchall(), key=lambda r: (r[1], r[2], r[3], r[4], r[5], r[6], r[7], r[8], r[9], r[10], r[11], r[12], r[13], r[14])):
tgs.append({
'labels': dict(zip(['VmName', 'Subnet','ResourceGroupName', 'VmSize', 'OsType', 'Region','SubscriptionId', 'ProjectName', 'Environment', 'DepartmentName', 'ApplicationName', 'CostCenterName', 'CostCeneterCode', 'App'], key)),
'targets': [t[0] for t in vals],
})
# Persist the target groups to disk as JSON file.
with open('/tgroups/target_groups_azure.json.new', 'w') as f:
json.dump(tgs, f)
f.flush()
os.fsync(f.fileno())
os.rename('/tgroups/target_groups_azure.json.new', '/tgroups/targets_azure.json')
sql_select_Query = "SELECT azure_vm.VmId FROM azure_vm LEFT JOIN azure_app ON azure_vm.VmId = azure_app.VmId WHERE azure_vm.state != 'VM Deleted' and azure_vm.Provisioned = 'api_azure' and azure_app.status != 'failed' or azure_app.status != 'removed'"
cur.execute(sql_select_Query)
records = cur.fetchall()
out=[item for t in records for item in t]
print(out)
for i in out:
manage = "Managed"
mySql_delete_query = """UPDATE azure_app LEFT JOIN azure_vm ON azure_vm.VmId = azure_app.VmId set azure_app.Monitoring_status = %s WHERE azure_app.VmId = %s and azure_app.status != 'failed' and azure_vm.state != 'VM Deleted' and azure_app.status != 'removed'"""
inputdata =(manage,i)
cur.execute(mySql_delete_query,inputdata)
cur.autocommit = True
if __name__ == '__main__':
while True:
with connect('HOST', 'username', 'password', 'database') as cur:
refresh(cur)
time.sleep(30)
解决方案
在没有上下文管理器支持的情况下,将代码的最后一部分更改为:
if __name__ == '__main__':
while True:
cur = None
try:
cur = connect('HOST', 'username', 'password', 'database')
refresh(cur)
finally:
if cur:
cur.close()
time.sleep(30)
推荐阅读
- redis - 如何在条件句中引用redis'nil?
- android - 将相机移动到 googlemap 上的热图显示
- linux - 如何将磁盘映像附加到包含 Linux 内核根文件系统的 QEMU?
- reactjs - 是否可以将数字存储在表单值中?
- python - 迁移django数据库时天蓝色无效的用户名
- arrays - 查找和替换列中的数据 - Google 表格
- sql - SUM + CONVERT DATATIME VACHAR
- ssis - 如何使用 SSIS 将记录附加到现有 Power BI 表
- javascript - https://router.vuejs.org/ 如何通过平滑滚动实现原生搜索?
- javascript - 在 React 和 setState 中有条件地渲染组件/元素时出现问题