首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果从函数导入模块x次,是否存在任何问题?

如果从函数导入模块x次,是否存在任何问题?
EN

Stack Overflow用户
提问于 2018-03-09 11:29:07
回答 2查看 40关注 0票数 0

我提取并将PyPDF2 1.26.0工具包放在插件目录中。层次结构如下所示:

代码语言:javascript
复制
plugin
  |__example.py
  |__report
       |__PyPDF2
            |__(PyPDF2 contents)

example.py文件的开头,我尝试使用以下方法导入PyPDF2模块:

代码语言:javascript
复制
from report.PyPDF2.PyPDF2 import PdfFileMerger

不幸的是,这会导致一个错误:

ImportError:没有名为Report.PyPDF2.PyPDF 2的模块

但是我可以使用sys导入它

代码语言:javascript
复制
import os, sys

class plugin:
    def __init__(self, iface):
        self.iface = iface
        self.plugin_dir = os.path.dirname(__file__)
        ...

    def pdf_merger(self):
        # Import PyPDF2
        sys.path.append(str(self.plugin_dir) + '/report/PyPDF2')        
        from PyPDF2 import PdfFileMerger

        merger = PdfFileMerger()
        return merger

    def func(self):
        merger = self.pdf_merger()
        ...

问题是func()将被多次调用,因此每次运行from PyPDF2 import PdfFileMerger。这会导致任何问题(例如内存问题或诸如此类),为什么我不能使用from report.PyPDF2.PyPDF2 import PdfFileMerger导入模块?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-09 12:55:07

我提取并将PyPDF2 1.26.0工具包放到插件目录中

我不知道您的“插件目录”是什么,但这不是安装python包的方法。您希望使用类似于pip的东西,最好与virtualenv一起使用。

ImportError:没有名为Report.PyPDF2.PyPDF 2的模块

我假设第一个"PyPDF2“目录是github根目录(cf https://github.com/mstamy2/PyPDF2)。这个目录不是正确的python包 (它没有__init__.py文件),而是项目的目录。您想要的只是在"report“中只有”第二级“PyPDF2目录(这是实际的python包),然后使用from report.PyPDF2 import PdfFileMerger从其中导入。

但是,再一次,这不是安装python包的正确方式,参见上文。

代码语言:javascript
复制
def pdf_merger(self):
    # Import PyPDF2
    sys.path.append(str(self.plugin_dir) + '/report/PyPDF2')        
    from PyPDF2 import PdfFileMerger

这将一次又一次地附加到sys.path中(如果您的进程运行几周或几个月,并且取决于调用此函数的频率,这可能会导致内存问题)。IOW:不要那样做,。正确地将PyPDF2安装为依赖关系(同样,pipvirtualenv是您的朋友),或者至少安装上面解释过的“内部”PyPDF2包。

请注意,这里的问题不是一次又一次地导入相同的模块(第一个导入将缓存模块),而是一次又一次地附加到sys.path。“本地”导入的唯一问题是性能受到很小的影响,但是您可能永远不会注意到它,除非这是一个非常紧的循环中调用的关键函数)。

而且当我们在做的时候:

代码语言:javascript
复制
    sys.path.append(str(self.plugin_dir) + '/report/PyPDF2')        

1/没有必要将self.plugin_dir传递给str (通常是第一个),而硬编码路径分隔符是一个非常糟糕的主意--相反,您需要的是os.path.join(self.plugin_dir, 'report', 'PyPDF2') (在这种情况下,您实际上不希望这样--不要让sys.path单独使用,而要正确地安装PyPDF2 )

票数 1
EN

Stack Overflow用户

发布于 2018-03-09 12:54:32

你试过:

代码语言:javascript
复制
from report.PyPDF2 import PdfFileMerger

无论如何,导入的模块都是缓存的,所以如果您多次导入,请不要担心。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49192768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档