使用 pyinstaller 创建的 exe 文件无法识别外部源
exe file created with pyinstaller not recognizing the external sources
我用 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.")
希望有人对此有具体的回答。
谢谢,
杰伦
定义一个函数来转换路径。
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)
,第三个参数是捆绑应用程序中您的文件将被复制到的文件夹的名称。然后文件将正常工作。
我用 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.")
希望有人对此有具体的回答。
谢谢,
杰伦
定义一个函数来转换路径。
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)
,第三个参数是捆绑应用程序中您的文件将被复制到的文件夹的名称。然后文件将正常工作。