【问题标题】:exe file created with pyinstaller not recognizing the external sources使用 pyinstaller 创建的 exe 文件无法识别外部源
【发布时间】:2016-09-27 08:53:51
【问题描述】:

我已经使用 Pyinstaller 成功创建了一个 exe 文件。但是,当我运行 exe 文件并在弹出 exe 文件的消息框中填写路径、文件和工作表名时,会显示我输入错误的文件名或工作表名的文件。显然我自己输入了这条消息,因此我的问题是:为什么 exe 文件很难找到我的文件,而当我在 PyCharm 中执行完全相同的操作时,运行它却没有问题?

 import pandas as pd
import numpy as np
import tkinter as tk
from tkinter import messagebox

def create_file():

try:
    FILEPATH = e0.get()
    w_filename = e1.get()
    x_filename = e2.get()
    y_filename = e3.get()
    z_inventory_filename = e4.get()
    aa_active_filename = e5.get()
    ab_test_filename = e6.get()
    output_filename = e7.get()

w_sheetname = e1_sheet.get()
x_sheetname = e2_sheet.get()
y_sheetname = e3_sheet.get()
z_sheetname = e4_sheet.get()
aa_sheetname = e5_sheet.get()
ab_test_sheetname = e6_sheet.get()
except:
    messagebox.showinfo("Error", "Please fill out all fields.")

try:
    w= pd.read_excel(FILEPATH +"\\"+ w_filename, sheetname=w_sheetname, header=0)
    x = pd.read_excel(FILEPATH +"\\"+ x_filename, sheetname=x_sheetname, header=0)
    y = pd.read_excel(FILEPATH +"\\"+y_filename, sheetname=y_sheetname, header=0)
    z_inventory = pd.read_excel(FILEPATH +"\\"+  z_inventory_filename, sheetname=z_inventory_sheetname, header=0)
    aa_active = pd.read_excel(FILEPATH +"\\"+ aa_active_filename, sheetname=aa_active_sheetname, header=0)
    ab_test_ready = pd.read_excel(FILEPATH +"\\"+ ab_test_filename, sheetname=ab_test_sheetname, header=0)
except:
    messagebox.showinfo("Error", "You have mistyped either a filename or a sheetname.")

希望有人对此有具体的答案。

谢谢,

杰伦

【问题讨论】:

  • 很可能是路径问题,但不看代码也很难说。
  • 我会稍后添加它

标签: python python-3.x exe pyinstaller


【解决方案1】:

定义一个函数来翻译路径。

import os, sys

def resource_path(relative_path):
    if hasattr(sys, "_MEIPASS"):
        base_path = sys._MEIPASS
    else:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

使用这个函数来扭曲你的文件路径,例如:

bingo_music = resource_path('resources/bingo.wav')
demo_file = resource_path('texts/demo.txt')

在您的.spec 文件中,将列表放入exe = EXE()

[('resources/bingo.wav', r'C:\Users\Administrator\resources\bingo.wav', 'music'),
[('texts/demo.txt', r'C:\Users\Administrator\texts\demo.txt', 'text'),],

将您在项目中使用的每个文件写入元组(relative_path, absolute_path, folder_name_in_bundled_app),第三个参数是将文件复制到的捆绑应用程序中的文件夹名称。然后文件将正常工作。

【讨论】:

  • 在我的情况下,文件将不在同一个文件夹中或具有相同的名称...此解决方案是否也适用于灵活的源路径或不同的命名文件?如果没有,还有什么其他选择?
猜你喜欢
  • 1970-01-01
  • 2022-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
相关资源
最近更新 更多