我在使用从其他模块导入全局变量时遇到问题。我确实通过了前面提供的示例答案,但无法解决问题。需要一些方向。
我想使用在utils.commonmodules.py的另一个模块中声明的变量。下面是commonmodules.py和dq_exec.py的代码库。dq_exec.py导入commonmodules.py并尝试使用变量(app_dq_db其中是全局的)
1.commonmodules.py
from utils.cfg import config
from utils.sparkSession import *
from utils.logsession import getloggingSession
import pandas as pd
import subprocess
############### Modules Imported #####################
logger=getloggingSession()
def getDqDefaultConfigParam():
logger.info('Getting all the parameters from Config')
global prc_cntrl_db
global app_dq_db
global dq_grp_config_tbl
prc_cntrl_db = config.get('hive_db_details', 'prc_cntrl_db')
logger.info(script_nm + ' -> prc_cntrl_db :: '+ prc_cntrl_db)
app_dq_db = config.get('hive_dq_config_tbl', 'app_dq_db')
logger.info(script_nm + ' -> app_dq_db :: '+ app_dq_db)
导入上述模块以及其他模块
2. dq_exec.py
from utils.commonmodules import getDqDefaultConfigParam
if __name__ == '__main__':
getDqDefaultConfigParam()
print("prc_name",getDqDefaultConfigParam.app_dq_db)
spark-submit /data/1/appgcb/bin/dq/spark/gen_dq_check_exec.py $ {app_id} $ {prc_name} $ {prc_run_id} $ {prc_start_dt} $ {prc_run_dt} $ {params_detl}
Output: I am able to see the values after calling the getDqDefaultConfigParam()but not able to access.
20191220084328 INFO: Line - 80 Getting all the parameters from Config
20191220084328 INFO: Line - 87 /data/1/appgcb/bin/dq/spark/gen_dq_check_exec.py -> prc_cntrl_db :: app_gcb_stg
20191220084328 INFO: Line - 89 /data/1/appgcb/bin/dq/spark/gen_dq_check_exec.py -> app_dq_db :: app_gcb_stg
20191220084328 INFO: Line - 91 /data/1/appgcb/bin/dq/spark/gen_dq_check_exec.py -> dq_grp_config_tbl :: dq_group_config
20191220084328 INFO: Line - 93 /data/1/appgcb/bin/dq/spark/gen_dq_check_exec.py -> dq_rule_config_tbl :: dq_rule_config
20191220084328 INFO: Line - 95 /data/1/appgcb/bin/dq/spark/gen_dq_check_exec.py -> dq_grp_config_colList :: ['dq_grp_name','app_id','prc_name','schema_name','table_nm','table_filter']
Traceback (most recent call last):
**File "/data/1/appgcb/bin/dq/spark/gen_dq_check_exec.py", line 110, in
print("prc_name",getDqDefaultConfigParam.app_dq_db)
AttributeError: 'function' object has no attribute 'app_dq_db'**
解决方案
global x意味着x在所有范围内都可用,而不是将其分配为我函数的属性。如果要分配属性,实际上需要一个类。
使用全局变量:
my_module.py:
x = 12
def y():
global x
x = 13
main.py:
import my_module
print(my_module.x)
my_module.y()
print(my_module.x)
output:
12
13
或者,如果您确实需要它作为属性:
my_module.py:
class z:
def __init__(self):
self.x = 13
main.py:
import my_module
my_z = my_module.z()
print(my_z.x)
output:
12
编辑:
因此,对于您的情况,请更换
def getDqDefaultConfigParam():
logger.info('Getting all the parameters from Config')
global prc_cntrl_db
global app_dq_db
global dq_grp_config_tbl
prc_cntrl_db = config.get('hive_db_details', 'prc_cntrl_db')
logger.info(script_nm + ' -> prc_cntrl_db :: '+ prc_cntrl_db)
app_dq_db = config.get('hive_dq_config_tbl', 'app_dq_db')
logger.info(script_nm + ' -> app_dq_db :: '+ app_dq_db)
与
class getDqDefaultConfigParam_cls:
def __init__(self):
logger.info('Getting all the parameters from Config')
self.prc_cntrl_db = config.get('hive_db_details', 'prc_cntrl_db')
logger.info(script_nm + ' -> prc_cntrl_db :: '+ prc_cntrl_db)
self.app_dq_db = config.get('hive_dq_config_tbl', 'app_dq_db')
logger.info(script_nm + ' -> app_dq_db :: '+ app_dq_db)
getDqDefaultConfigParam = getDqDefaultConfigParam_cls()
在中commonmodules.py。
现在getDqDefaultConfigParam.app_dq_db,您可以使用,就像getDqDefaultConfigParam具有正确属性的类的实例一样。