Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果从函数导入模块x次,是否存在任何问题?_Python_Import_Pypdf2 - Fatal编程技术网

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
,但想看看这个方法是否有效(在某种程度上确实有效):)