簡體   English   中英

從不同目錄和文件中的 python 模塊訪問全局變量時出現問題

[英]Issues while accessing global variable from a python module in a different dir and file

我在使用來自不同模塊的全局變量導入時遇到問題。 我確實通過了之前提供的示例答案,但無法解決問題。 需要一些指導。

我想使用在 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 <module>
    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是具有正確屬性的類的實例。

我認為如果您在getDqDefaultConfigParam函數中返回所需的變量會更好。

您可以在commonmodules.py進行此更改:

def getDqDefaultConfigParam():
    logger.info('Getting all the parameters from Config')
    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)
    return prc_cntrl_db, app_dq_db, dq_grp_config_tbl

然后在dq_exec.py解壓它們:

prc_cntrl_db, app_dq_db, dq_grp_config_tbl = getDqDefaultConfigParam()
print(f'prc_name {app_dq_db}')

作為旁注,函數我發現這些變量和函數名稱很難理解——它們都非常相似。 有沒有辦法更好地命名它們?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM