2016-05-03 28 views
0

sqliteデータベースからデータを取得してプロットする簡単なスクリプトを作成したかったのです。しかし、私がモジュールをインポートするとき、それは私がやったことを好まない。誰かが私が間違っていることについて私に指示することはできますか?モジュールの作成とインポート - NameError:グローバル名 'c'が定義されていません

同じ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

インポートは正しいですが、メインの接続を開きます。この接続は、モジュールとして使用すると実行されません。なぜあなたはあなたのpull_dataメソッド内でこの

c = sqlite3.connect('Test_db19.db') 
c.connect() 

を移動し、その後、あなたのpulldata.pyファイルの先頭に方法外これら

import matplotlib.pyplot as plt 
import datetime 
import sqlite3 

を移動しないでください。あなたがファイルをインポートする場合

if __name__ == "__main__": 

すべてが実行されません。この部分は、この場合、実行する場合にのみ実行されます

python pulldata.py 
+0

答えをいただきありがとう、本当に役に立ちます。私はあなたが__main__について何を意味するのかを見て、私は今それを修正するでしょう。しかし、私はまだ同じエラーを表示するようですか? "グローバル名cは定義されていません"? – Ciaran

+1

すべてをリセットしてもう一度実行して、完璧に動作しました!ありがとう!!私はあなたが今から説明した方法をモジュールに取り組むことを確実にします! – Ciaran

1

あなたがそれをインポートするとき、それはあなたのmain()関数を入力して定義しdoesntのないようにpulldataがメインではないので

if __name__ == "__main__" 

が偽されて終わるので、あなたがimport pulldataあなたのC変数が定義されません。 c。 また、main()関数のcはローカル変数であるため、定義されていても別の関数からアクセスすることはできません。

+0

ありがとうございます。私はこれにどのようにアプローチすべきですか?私はc = sqlite3.connect( 'Test_db19.db')をpull_data関数に移動する必要がありますか?そして、モジュール全体をインポートしてください – Ciaran

+1

@Ciaranはmain()メソッドの外にインポートを移動し、pull_data内のCを接続します – Daniel

関連する問題