我正在编写一个Python应用程序(基于控制台),它使用PostgreSQL数据库(通过psycopg2)和R(通过rpy)。它是一个基于过程的大型应用程序,涉及多个步骤,有时重复步骤,并不总是涉及所有步骤。
我有以下几点:
main_file.py
modules/__init__.py
modules/module1.py
modules/module2.py
functions/__init__.py
functions/function1.py
functions/function2.pyinit文件只表示导入module1、module2或function1,function2取决于它是哪个init文件。
main_file.py的内容如下所示:
import modules
from functions import function1
class myClass():
def my_function(self):
scripts = [
# modules.module1.function,
modules.module2.function,
]
print "Welcome to the program."
function1.connect()
for i in scripts:
i
cur.close()
print "End of program"
if __name__ == '__main__':
myClass().my_function()如果不需要的话,循环的原因是注释掉某些步骤。我试图调用的connect()函数是psycopg2连接。它看起来如下(在函数1.py文件中):
import sys
import psycopg2
def connect():
try:
con = psycopg2.connect(database=dbname, user=dbuser)
cur = con.cursor()
db = cur.execute
except psycopg2.DatabaseError, e:
if con:
con.rollback()
print e
sys.exit在main_file.py示例中,我试图运行module2,它需要连接到数据库,使用如下所示:
def function:
db("SELECT * INTO new_table FROM old_table")
con.commit()如何让Python (2.7)识别全局名称db、cur和con?因此,通过程序中的所有步骤连接到数据库并保持活动连接?
发布于 2014-07-28 14:32:54
您应该向模块中添加一个函数,该模块初始化将返回创建的DB对象的DB,然后拥有每个想要使用DB调用该函数的模块:
函数1.py
import sys
import psycopg2
con = cur = db = None
def connect():
global con, cur, db
try:
con = psycopg2.connect(database=dbname, user=dbuser)
cur = con.cursor()
db = cur.execute
except psycopg2.DatabaseError, e:
if con:
con.rollback()
print e
sys.exit
def get_db():
if not (con and cur and db):
connect()
return (con, cur, db)函数2.
import function1
con, cur, db = function1.get_db()
def function:
db("SELECT * INTO new_table FROM old_table")
con.commit()没有办法使某些变量对包中的每个模块都是全局的。您已经显式地从它们所在的任何模块导入它们,或者通过函数调用返回它们。
https://stackoverflow.com/questions/24996370
复制相似问题