【问题标题】:Error when compiling with pyinstaller with configparser使用 configparser 编译 pyinstaller 时出错
【发布时间】:2021-08-25 00:08:39
【问题描述】:

当我使用 pyinstaller 编译时出现错误,它可以在我的电脑上运行,而不是在其他电脑上。

我得到的错误

Traceback (most recent call last):
  File "app.py", line 30, in <module>
    password = parser.get('settings', 'password')
  File "configparser.py", line 781, in get
  File "configparser.py", line 1152, in _unify_values
configparser.NoSectionError: No section: 'settings'
[9464] Failed to execute script 'app' due to unhandled exception!

这是我的代码

parser = ConfigParser()
parser.read('C:\\Users\\abc\Desktop\\Maker\\settings.ini')

我遵循了一些解决方案,但仍然没有运气解决这个问题,有人可以帮忙吗?

我也尝试了这个解决方案,但没有运气

def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    try:
        # PyInstaller creates a temp folder and stores path in _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)

parser = ConfigParser()
settings_file = resource_path('settings.ini')

【问题讨论】:

    标签: python pyinstaller configparser


    【解决方案1】:

    您必须确保将您的 ini 文件与您的应用程序捆绑在一起。如果您使用 UPX 将所有文件压缩为一个可执行文件,这会有点困难。我从来没有看到这一点,因为这似乎是一种虚假的储蓄。每次运行 EXE 时,它都会将所有文件解压缩到一个临时文件夹中。然后,您的应用程序现在会消耗所有未压缩空间以及所有压缩空间。哎呀。

    我建议您使用Spec file 来指定所有额外的 您想要包含在您的应用程序中的文件。

    出于调试目的,您可以将其放入您的程序中,以确保 ini 文件位于您认为的位置(您可以将其删除或在确认文件存在后将其注释掉)

    print(os.listdir(<path>))
    

    print(os.listdir(os.getcwd()))
    

    其中 getcwd 代表“获取当前工作目录”,它应该是您的 EXE 所在的目录。

    如果你不想弄乱spec文件,你可以将--add-data参数传递给pyinstaller并传递你的ini文件。

    【讨论】:

    • 我想让它变得简单,只需要一个文件,因为这是一个非常小的脚本。我正在尝试添加一项功能,以便用户可以更改设置。
    • @nomie。我想我已经习惯了使用 PyQt、numpy 和 matplotlib,以至于我的 pyinstaller dist 文件夹总是很大。我刚刚做了一个“hello world”脚本,它只使用 python 而没有 GUI。 14 MB dist 文件夹。对于这么小的东西,也许 UPX EXE 是有意义的。您可以将这样的文件提供给某人,他们可以将其放在桌面上并轻松运行。无论如何print(os.listdir(os.getcwd()))会给你一个文件列表,你可以用它来调试。
    • 我现在用 cx_freeze 编译了它,问题是它没有更新编译文件中的链接,它仍然带有我电脑中的路径。
    • @nomie,您 PC 的路径是硬编码的吗?如果为真,那么您必须将代码更改为 path = os.path.join(os.getcwd(), settings.ini; parser.read(path) 之类的内容。此外,使用 cx_freeze 您必须确保告诉它包含您的 ini 文件。
    • 感谢您提供的所有帮助,使其与一些调整和您发布的解决方案一起工作。
    猜你喜欢
    • 2012-02-19
    • 1970-01-01
    • 2020-09-13
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    相关资源
    最近更新 更多