我正在编写一个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.py
init文件只是声明导入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连接。它看起来像这样(在function1.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?因此,一次性连接到数据库并通过程序中的所有步骤保持活动连接?
答案 0 :(得分:0)
您应该向初始化将返回已创建的DB对象的DB的模块添加一个函数,然后让每个想要使用该函数的DB调用的模块:
<强> function1.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)
<强> function2.py 强>
import function1
con, cur, db = function1.get_db()
def function:
db("SELECT * INTO new_table FROM old_table")
con.commit()
没有办法让某些变量对包中的每个模块都是全局的。您已经从它们所在的任何模块中明确地导入它们,或者从函数调用中返回它们。