我提取并将PyPDF2 1.26.0工具包放在插件目录中。层次结构如下所示:
plugin
|__example.py
|__report
|__PyPDF2
|__(PyPDF2 contents)在example.py文件的开头,我尝试使用以下方法导入PyPDF2模块:
from report.PyPDF2.PyPDF2 import PdfFileMerger不幸的是,这会导致一个错误:
ImportError:没有名为Report.PyPDF2.PyPDF 2的模块
但是我可以使用sys导入它
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导入模块?
发布于 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包的正确方式,参见上文。
def pdf_merger(self):
# Import PyPDF2
sys.path.append(str(self.plugin_dir) + '/report/PyPDF2')
from PyPDF2 import PdfFileMerger这将一次又一次地附加到sys.path中(如果您的进程运行几周或几个月,并且取决于调用此函数的频率,这可能会导致内存问题)。IOW:不要那样做,。正确地将PyPDF2安装为依赖关系(同样,pip和virtualenv是您的朋友),或者至少安装上面解释过的“内部”PyPDF2包。
请注意,这里的问题不是一次又一次地导入相同的模块(第一个导入将缓存模块),而是一次又一次地附加到sys.path。“本地”导入的唯一问题是性能受到很小的影响,但是您可能永远不会注意到它,除非这是一个非常紧的循环中调用的关键函数)。
而且当我们在做的时候:
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 )
发布于 2018-03-09 12:54:32
你试过:
from report.PyPDF2 import PdfFileMerger无论如何,导入的模块都是缓存的,所以如果您多次导入,请不要担心。
https://stackoverflow.com/questions/49192768
复制相似问题