我想创建一个简单的脚本来从sqlite数据库中提取和绘制数据。但是,当我导入模块时,它不像我所做的那样。任何人都可以指导我做错了吗?
每个脚本在同一个ipython笔记本中运行时都有效,当我尝试使用下面的代码创建一个模块时,它会失败:
我的pulldata.py脚本:
def main()
import matplotlib.pyplot as plt
import datetime
import sqlite3
c = sqlite3.connect('Test_db19.db')
c.connect()
def pull_data(table1, field1):
x_axis = []
y_axis = []
dates = []
for row in c.execute('SELECT date, {fn} FROM {tn} ORDER BY date'.format(tn=table1, fn=field1)):
y_axis.append(row[1])
dates.append(row[0])
for date in dates:
date1 = datetime.datetime.strptime(date, "%m/%Y").date()
x_axis.append(date1)
plt.plot(x_axis,y_axis, marker = "o")
plt.xlabel('Date')
plt.ylabel(field1)
plt.title(table1)
plt.xticks(rotation=70)
plt.legend()
plt.show()
if __name__ == "__main__":
main()
尝试导入它:
import pulldata as pd
pd.pull_data(table_name, column_name)
我得到了:
"NameError: global name 'c' is not defined"
非常感谢任何建议/帮助!!
答案 0 :(得分:2)
您的导入是正确的,但是您在 main 方法中打开了连接,当您将其用作模块时,您不会运行该连接。你为什么不搬这些
import matplotlib.pyplot as plt
import datetime
import sqlite3
在pulldata.py文件顶部的方法之外,然后移动
c = sqlite3.connect('Test_db19.db')
c.connect()
在你的pull_data方法中。
下的一切
if __name__ == "__main__":
如果导入文件,则不会运行。只有在这种情况下,您才能运行此部分
python pulldata.py
答案 1 :(得分:1)
当import pulldata
你的c变量从
if __name__ == "__main__"
最终是假的,因为当你导入它时,pulldata不是你的主要因素,因此它不会输入你的main()
函数并且不会定义c。
此main()
函数中的c也是一个局部变量,因此即使已定义,也无法从其他函数访问它。