繁体   English   中英

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

[英]Python - Calling python function from another script

我正在尝试从另一个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

谁能帮助我确定我在哪里出了问题。 谢谢

db_curdb_login具有本地作用域。 这意味着无法在db_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')

在python中,“ global”实际上意味着“模块级全局”,而不是“应用程序全局”,因此dwh_connectiondwh_curfile2不会自动可用。

话虽这么说,在这里依赖全局变量是一个坏主意-您的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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM