首页 > 解决方案 > 使用池调用函数时,它显示未定义主(全局)中的变量

问题描述

可能是我的问题看起来很简单(或者错误可能很小),但我无法找到错误,真的我费了很大劲才弄清楚这个问题。

我已经创建了一个框架来使用简单的 Salesforce 包从 Salesforce 中提取数据,但是当我使用多处理时遇到了这个错误。

我的代码非常简单,但很乏味。我不想在这里粘贴整个代码,所以这是我的 GitHub中的代码。

问题:

当我使用 Pool 调用此Extract Data 函数时,其中的变量__name__ == '__main__'不起作用。

换句话说,我得到了NameError: name 'SFAPI' is not defined - 但它作为全局变量存在于主目录中,并且它在没有池的情况下工作(一次调用)。

执行示例:

python "E:\Documents\myPy\SF Project\sf_extraction.py" -pr data_extraction -tn Opportunity Account

我的代码中的小片段,我遇到了问题:

def ExtractData(table_name):
    logging.info('Extract Data for Table Name: ' + table_name + ' at ' + getCurrDatetime())
    try:
        rec_count = getRecordCount(table_name)
        print(rec_count)
        if int(rec_count) == 0:
            logging.info('There is no data to Extract for {}'.format(table_name))
        else:
            soql = SFAPI.CreateSOQL(table_name)
            data = SFAPI.ExecuteSOQL(soql, is_count=0)
            extract_file_nm = table_name + '_' + db_name + '_'  + sc_name + '_' + curr_datetime + '.csv'
            print(data)
            print(type(data))
            extract_file = os.path.expanduser(os.path.join(script_path,extract_file_nm))
            data.to_csv(extract_file, index=False)
            logging.info('Data has been extrcated as {} at {}'.format(extract_file, getCurrDatetime()))

    except Exception as e:
        logging.info('Error in Extraction')
        err_msg = "FATAL_ERROR: In the ExtractData Function : {0}\n\n{1}".format(e, traceback.format_exc())
        raise Exception(str(err_msg))

我称之为的地方或片段:

if __name__ == '__main__':
    try:
        SFAPI = SalesforceAPICall(username=config['username'],
                            password=config['password'],
                            security_token=config['sf_token'],
                            )

        if len(table_name) != 0 and 'data_extraction' in process_nm:
            try: 
                if len(table_name) == 1:
                    print(table_name[0])
                    ExtractData(table_name[0])
                if type(table_name) == list and len(table_name) > 1:
                    #p = Pool(processes=int(processes))
                    print('Calling Pool : ' + str(os.cpu_count()))
                    #out = p.map(ExtractData, table_name)
                    #p.close()
                    #p.join()
                    p = Pool()
                    print(table_name)
                    x = p.map(ExtractData, table_name)
                    x.get()
                    p.close()
                    p.join()
            except Exception as e:
                if len(table_name) > 1:
                    p.terminate()
                    p.join()
                logging.error("Process Failed - " + str(e))
    except Exception as e:
        chk_err('FATAL_ERROR: ' + " from main exception : {0}\n\n{1}".format(e, traceback.format_exc()))

如果我在 GitHub 上的代码看起来很笨拙,或者你觉得这部分信息不足以修复,你可以很好地参考我的代码。

同样,它可能是一个小错误,希望您能理解我要传达的内容!!!提前致谢 !!!

问候, Parvathirajan Natarajan

标签: pythonpython-3.xsalesforcepython-multiprocessingsimple-salesforce

解决方案


推荐阅读