Python-从另一个脚本调用python函数

时间:2018-09-17 10:20:12

标签: python python-3.x function

我正在尝试从另一个python脚本调用数据库连接。我不断收到错误NameError:名称

'db_cur' 

未定义。下面给出的是我正在使用的代码:

file1.py

import psycopg2
def db_login():
    global dwh_connection
    global dwh_cur
    try:
        dwh_connection = psycopg2.connect(db_details)
        db_cur = dwh_connection.cursor()
    except:
        print("Conn failed")
    print('Connection Success')

file2.py

from file1 import db_login

def rep1():
    db_cur.execute("""SQL statement""")
    dwh_connection.commit()
    dwh_connection.close()
    print('Task Completed')

这会引发错误

NameError: name 'db_cur' is not defined

任何人都可以帮助我弄清楚我在哪里出错了。谢谢

2 个答案:

答案 0 :(得分:0)

db_curdb_login中具有本地范围。这意味着无法在db_login外部对其进行访问。更好的方法是返回对象并在脚本2中使用返回的对象。

例如,file1.py:

import psycopg2

def db_login():
    global dwh_connection
    global dwh_cur
    try:
        dwh_connection = psycopg2.connect(db_details)
        db_cur = dwh_connection.cursor()
        return db_cur 
    except:
        print("Conn failed")
        return None
    print('Connection Success')

file2.py

from file1 import db_login

def rep1():
    db_cur = db_login()
    if db_cur is not None:
        db_cur.execute("""SQL statement""")
        dwh_connection.commit()
        dwh_connection.close()

    print('Task Completed')

答案 1 :(得分:0)

在python中,“全局”实际上表示“模块级全局”,而不是“应用程序全局”,因此dwh_connectiondwh_curfile2中不会自动可用。 / p>

这就是说,在这里依赖全局变量是一个坏主意-您的db_login()函数应该返回连接而不是设置全局变量(或者如果您将模块级别全局变量设置为全局变量,要避免打开多个连接)。

此外,您根本不应在此处创建游标-游标不是可重入的,并且每次需要时都应重新创建(创建游标非常便宜)。

最后,db_login()中的异常处理程序要比没用的要糟,它只是有害的-而不是详细的错误消息(和回溯)尽可能准确地解释出了什么问题(因此您有机会调试问题),您只会收到完全没用的“连接失败”消息。

长话短说,函数的“正确”等效版本是:

def db_login():
    return psycopg2.connect(db_details)

还请注意,在file2.py模块中,您导入了db_login,但从未调用它:

from file1 import db_login

def foo():
    db = db_login()
    cursor = db.cursor()
    try:
        # do something with the cursor
    finally:
       # make sure you close the connection
       db.close()