Python 3.6.6上的模块sys有NO_MEIPASS成员错误

2022-03-23 00:00:00 python pyinstaller

问题描述

我一直在尝试将json文件捆绑到用pyinstaller创建的python可执行文件中。经过大量研究,我找到的解决方案涉及到使用_MEIPASS文件夹;但是,VSCode声称sys包没有_MEIPASS成员。

我的代码的相关部分如下所示:

branches_path = 'bank_branches/bank_branches.json'

if hasattr(sys, "_MEIPASS"):
     branches_path = os.path.join(sys._MEIPASS, branches_path)

代码可以在终端版本上运行,也可以在独立应用程序上运行,因此这一点会得到解决;但是,我想知道是否有有效且没有相关错误的解决方案。如果有帮助,我使用的是Python 3.6.6


解决方案

我在使用pyinstaller创建可执行文件时遇到了类似的问题。我必须对脚本进行两次更改才能获得功能可执行文件。

首先,我创建了此函数:

def resource_path(relative_path):
    try: 
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

我的脚本中有几个类,因此我将其单独放在最后,以便所有类都可以引用它。然后我替换了我使用的所有函数

os.getcwd()

-这从一开始就可能是个坏主意-

resource_path() 

对于resource_path()内部的变量,我使用了以下函数:

os.path.dirname(os.path.abspath(__file__))

该函数返回我想要的;正在运行的文件/程序的位置。

那么,之前是这样写的:

filePath = os.getcwd() + "\my_file.csv"

现在显示为:

filePath = resource_path(os.path.dirname(os.path.abspath(__file__))) + "\my_file.csv"

一旦准备就绪,我的程序就能正确编译并按预期执行,希望它也能对您有所帮助。

相关文章