首页 > 解决方案 > 类初始化时导入的模块不能被方法使用

问题描述

我创建了一个类,它在启动时导入一些模块,然后这些模块在一些类方法中使用。当我在方法中调用模块时,我得到一个 NameError ,这些模型没有定义

class Paper(object):
    '''
    analyse a paper and extract parts of it
    '''
    def __init__(self, paper_path):

        #import needed modules
        needed_modules = ['io', 'pdfminer', 'pickle', 're', 'string', 'os']
        import io, pickle, re, string, os

        from pdfminer.converter import TextConverter as TC
        from pdfminer.pdfinterp import PDFPageInterpreter as PInt
        from pdfminer.pdfinterp import PDFResourceManager as RM
        from pdfminer.pdfpage import PDFPage as Page
        from pdfminer.layout import LAParams as LAP

        self._pPath = paper_path


    def get_text(self):
        res_manager = RM()
        fake_file_handle = io.StringIO()
        codec = 'utf-8'
        laparams = LAP()
        converter = TextConverter(res_manager,
        fake_file_handle,codec=codec, laparams=laparams)
        page_interpreter = PInt(res_manager, converter)

        with open(self._pPath, 'rb') as fh:
            for page in Page.get_pages(fh,
                                          caching=True,
                                          check_extractable=True):
                page_interpreter.process_page(page)

            text = fake_file_handle.getvalue()

        # close open handles
        converter.close()
        fake_file_handle.close()

        if text:
            return text

运行此代码时:

pPath = 'path'

item = Paper(pPath)
print(len(item.get_text()))

我收到以下错误

NameError: name 'RM' is not defined

标签: pythonpdfminer

解决方案


正如 Harm 所说:导入对于您的__init__方法来说是本地的。您需要将它们向上移动或将它们存储到某个变量中,然后locals()在每个方法中更新。

一个非常丑陋的黑客:

def __init__(self, paper_path):
    ...
    self.imports = locals()  # possibly only include the imports, not the entire dict

def get_text(self):
    locals().update(self.locals) 

推荐阅读