创建和导入模块 - NameError:未定义全局名称“c”

时间:2016-05-03 12:30:51

标签: python sqlite import module

我想创建一个简单的脚本来从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"

非常感谢任何建议/帮助!!

2 个答案:

答案 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也是一个局部变量,因此即使已定义,也无法从其他函数访问它。