Python 如果从函数导入模块x次,是否存在任何问题?
我提取工具包并将其放入插件目录中。层次结构如下所示:Python 如果从函数导入模块x次,是否存在任何问题?,python,import,pypdf2,Python,Import,Pypdf2,我提取工具包并将其放入插件目录中。层次结构如下所示: plugin |__example.py |__report |__PyPDF2 |__(PyPDF2 contents) 在example.py文件的开头,我尝试使用以下方法导入PyPDF2模块: from report.PyPDF2.PyPDF2 import PdfFileMerger 不幸的是,这会导致一个错误: 导入错误:没有名为report.PyPDF2.PyPDF2的模块 但是我
plugin
|__example.py
|__report
|__PyPDF2
|__(PyPDF2 contents)
在example.py
文件的开头,我尝试使用以下方法导入PyPDF2模块:
from report.PyPDF2.PyPDF2 import PdfFileMerger
不幸的是,这会导致一个错误:
导入错误:没有名为report.PyPDF2.PyPDF2的模块
但是我可以使用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()
将被多次调用,因此每次从PyPDF2导入Pdfilemerger的都将运行。这是否会导致任何问题(即内存问题或诸如此类的问题),为什么我不能使用report.PyPDF2.PyPDF2 import PdfFileMerger导入模块?您是否尝试过:
from report.PyPDF2 import PdfFileMerger
无论如何,导入的模块是缓存的,所以如果您多次导入一个模块,请不要担心。您是否尝试过:
from report.PyPDF2 import PdfFileMerger
无论如何,导入的模块是缓存的,所以如果您多次导入一个模块,也不用担心
我提取了PyPDF2 1.26.0工具包并将其放入我的插件目录中
我不知道你的“插件目录”是什么,但这不是安装python包的方法。您希望使用类似于pip
的东西,最好使用virtualenv
导入错误:没有名为report.PyPDF2.PyPDF2的模块
我假设第一个“PyPDF2”目录是github根目录(cf)。此目录不是项目的目录(它没有\uuuu init\uuuu.py
文件),而是项目的目录。您想要的是在“report”中只包含“second-level”PyPDF2目录(即实际的python包),然后使用从report.PyPDF2导入PdfFileMerger
从中导入
但同样,这不是安装python包的正确方法,参见上文
def pdf_merger(self):
# Import PyPDF2
sys.path.append(str(self.plugin_dir) + '/report/PyPDF2')
from PyPDF2 import PdfFileMerger
这将不断地一次又一次地附加到sys.path
(如果进程运行数周或数月,这可能会导致内存问题,具体取决于调用此函数的频率)。注意:不要那样做。正确地安装PyPDF2作为依赖项(同样,pip
和virtualenv
是您的朋友),或者至少只安装“内部”PyPDF2包,如上所述
请注意,这里的问题不是反复导入同一个模块(第一次导入将缓存该模块),而是反复追加到sys.path
。“本地”导入的唯一问题是性能受到了非常轻微的影响,但您可能永远不会注意到它,除非这是在非常紧密的循环中调用的关键函数)
同时,当我们在做的时候:
sys.path.append(str(self.plugin_dir) + '/report/PyPDF2')
1/无需将self.plugin\u dir
传递到str
(通常是这样),并且
2/硬编码路径分隔符是一个非常糟糕的主意-您需要os.path.join(self.plugin_dir,'report','PyPDF2')
(在这种情况下,您实际上不需要任何分隔符-不要使用sys.path
,而是正确安装PyPDF2)
我提取了PyPDF2 1.26.0工具包并将其放入我的插件目录中
我不知道你的“插件目录”是什么,但这不是安装python包的方法。您希望使用类似于pip
的东西,最好使用virtualenv
导入错误:没有名为report.PyPDF2.PyPDF2的模块
我假设第一个“PyPDF2”目录是github根目录(cf)。此目录不是项目的目录(它没有\uuuu init\uuuu.py
文件),而是项目的目录。您想要的是在“report”中只包含“second-level”PyPDF2目录(即实际的python包),然后使用从report.PyPDF2导入PdfFileMerger
从中导入
但同样,这不是安装python包的正确方法,参见上文
def pdf_merger(self):
# Import PyPDF2
sys.path.append(str(self.plugin_dir) + '/report/PyPDF2')
from PyPDF2 import PdfFileMerger
这将不断地一次又一次地附加到sys.path
(如果进程运行数周或数月,这可能会导致内存问题,具体取决于调用此函数的频率)。注意:不要那样做。正确地安装PyPDF2作为依赖项(同样,pip
和virtualenv
是您的朋友),或者至少只安装“内部”PyPDF2包,如上所述
请注意,这里的问题不是反复导入同一个模块(第一次导入将缓存该模块),而是反复追加到sys.path
。“本地”导入的唯一问题是性能受到了非常轻微的影响,但您可能永远不会注意到它,除非这是在非常紧密的循环中调用的关键函数)
同时,当我们在做的时候:
sys.path.append(str(self.plugin_dir) + '/report/PyPDF2')
1/无需将self.plugin\u dir
传递到str
(通常是这样),并且
2/硬编码路径分隔符是一个非常糟糕的主意-你想要os.path.join(self.plugin_dir,'report','PyPDF2')
(在这种情况下,你实际上不想要这些-别管sys.path
,正确安装PyPDF2)谢谢你的回答,问题仍然存在。谢谢你的回答,问题仍然存在。谢谢你的回答。我以前使用过pip
,但想看看这个方法是否有效(在某种程度上是有效的):)谢谢你的回答。我以前使用过pip
,但想看看这个方法是否有效(在某种程度上确实有效):)