- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用 Pyinstaller 将 Python 脚本转换为独立的可执行程序。
当我在spyder中测试我的脚本时,它可以工作,但作为exe文件却不能,我不明白为什么。
我的程序由以下部分组成:
由一系列函数组成的处理。它以两个 csv 文件作为输入并返回单行 pandas DataFrame。最后一个函数称为 add_data()
test()
函数调用 add_data(),将其结果保存在 csv 文件中,并在执行结束时通知用户
带有 try-except 条件的 execute_test()
函数; try 使用来自 GUI 的用户输入调用 test(), except 显示错误消息框。
tkinter GUI 要求用户选择两个 csv 文件 + test() 将保存 csv 结果的目录。
在spyder上,当执行python脚本时,我选择文件和目录,它返回“处理完成”消息框,因此问题不应来自脚本本身。
Pyinstaller 成功构建了 exe 文件。我可以打开它,出现 GUI 和命令提示符;条目和按钮工作正常。
在选择相同的文件和目录后启动处理时,它仅返回错误消息框,这意味着处理由于某种原因没有执行。我从提示中收到的唯一消息是:
C:\Users...\Continuum\miniconda3\envs\myenv\lib\site-packages\PyInstaller\loader\pyimod03_importers.py:627: MatplotlibDeprecationWarning: The MATPLOTLIBDATA environment variable was deprecated in Matplotlib 3.1 and will be removed in 3.3.
我没有在我的程序中显式导入matplotlib,而且我之前也没有在我的环境中安装它。我在收到此消息后执行了此操作,但没有任何改变。
包括我的治疗的整个代码太长,但我明确导入的是:pandas、geopandas、shapely.geometry、tkinter(参见下面的代码)。由于我之前遇到过问题(已解决),因此在使用 geopandas 时似乎也需要 pyproj
如果需要,我可以提供将脚本转换为 .exe 时得到的完整提示输出。值得一提的是我得到了:
一些排除导入,涉及PySide、PyQt5、gtk、matplotlib、PyQt4、tkinter
此警告:71826警告:未找到隐藏导入“PyQt5.sip”!
并且警告指出它没有找到某些DLL:
81853 INFO: Looking for dynamic libraries
81931 WARNING: lib not found: tbb.dll dependency of ...\mkl_tbb_thread.dll
81978 WARNING: lib not found: msmpi.dll dependency of C:\Users\...\bin\mkl_blacs_msmpi_lp64.dll
82509 WARNING: lib not found: pgf90rtl.dll dependency of C:\Users\...\bin\mkl_pgi_thread.dll
82525 WARNING: lib not found: pgc14.dll dependency of C:\Users\...\bin\mkl_pgi_thread.dll
82556 WARNING: lib not found: pgf90.dll dependency of C:\Users\...\bin\mkl_pgi_thread.dll
82587 WARNING: lib not found: msmpi.dll dependency of C:\Users\...\bin\mkl_blacs_msmpi_ilp64.dll
82634 WARNING: lib not found: mpich2mpi.dll dependency of C:\Users\...\bin\mkl_blacs_mpich2_lp64.dll
82712 WARNING: lib not found: mpich2mpi.dll dependency of C:\Users\...\bin\mkl_blacs_mpich2_ilp64.dll
82869 WARNING: lib not found: impi.dll dependency of C:\Users\...\bin\mkl_blacs_intelmpi_lp64.dll
83025 WARNING: lib not found: impi.dll dependency of C:\Users\...\bin\mkl_blacs_intelmpi_ilp64.dll
我使用 Miniconda 并尽量避免使用 pip。我的环境配置是:
- Windows 10 / conda 4.7.10 / Python 3.7.3 / spyder 3.3.6
- pandas 0.25.0 / geopandas 0.5.1 / pyproj 2.2.1 / tk 8.6.9
- numpy 1.16.4 / matplotlib 3.1.1
- pyinstaller 3.5 / setuptools 41.0.1 / pywin32 224
还有很多我不太了解的其他包和模块(尽管不是 anaconda)。
我什至不知道到底要放什么标题,因为我不知道错误来自哪里(我的猜测是 tkinter、matplotlib 或者可能是 numpy)。
我还想说,我是一个相当初级的程序员,我在整个包/模块/导入/依赖项/DLL/兼容性方面遇到了困难。仍在研究它,我广泛理解大多数概念,但我可能需要详细解释这个级别上发生的事情才能调试它。有人可以帮忙吗?
from tkinter import Tk, Frame, Label, Button, Entry,\
filedialog as fd, messagebox
## Functions that will be called by user interaction with the GUI
def test(file_L, file_T, directory):
df_test = add_data(file_L, file_T) # calls the previous treatment
path=str(directory)+'/'+'test_result.csv'
df_test.to_csv(path, encoding='utf-8', index=False)
messagebox.showinfo("End", "The treatment is done")
def execute_test(inputL, inputT, inputD):
try:
return test(inputL.filedir.get(),
inputT.filedir.get(),
inputD.selecdir.get())
except:
messagebox.showerror("Error", "The program failed to launch.\n"\
"Either the inputs are not correct, or an "\
"intern error occured.")
# Class Button + Entry to select a csv file
class Selection:
def __init__(self, master):
self.filedir = Entry(master, bd=2)
self.load_button = Button(master, text="...", bg='yellow',
command=self.loadFile)
def loadFile(self):
self.filename = fd.askopenfilename(
filetypes = (("csv files","*.csv"),("all files","*.*"))
)
self.filedir.delete(0,"end")
self.filedir.insert(0, self.filename)
# Class Button + Entry to select a directory
class Directory:
def __init__(self, master):
self.selecdir = Entry(master, bd=2)
self.load_button = Button(master, text="...", bg='yellow',
command=self.loadDir)
def loadDir(self):
self.dirname = fd.askdirectory()
self.selecdir.delete(0,"end")
self.selecdir.insert(0, self.dirname)
# GUI itself
if __name__=='__main__':
from functools import partial
#-----Defining the root
root = Tk()
root.geometry("+800+400")
#-----Defining the Frames
f2 = Frame(root)
f2.grid_columnconfigure(0, weight=2)
f2.grid_columnconfigure(1, weight=1)
f2.grid_rowconfigure(0, weight=1)
f2.grid_rowconfigure(1, weight=1)
f2.grid_rowconfigure(2, weight=1)
f2.grid_rowconfigure(3, weight=1)
f2.grid_rowconfigure(4, weight=1)
f2.grid_rowconfigure(5, weight=1)
f3 = Frame(root)
#-----Defining the widgets
TextL = Label(f2, text="Please select file L :")
L = Selection(f2)
TextT = Label(f2, text="Please select file T :")
T = Selection(f2)
TextD = Label(f2, text="Please select the directory in which the result "\
"will be saved as a csv :")
D = Directory(f2)
b_validate = Button(f3, text="Execute", bg='cyan',
command = partial(execute_test, L, T, D))
b_exit = Button(f3, text="Exit", bg='red', command = root.destroy)
#-----Geometry managers
f2.pack(expand=True)
f3.pack(side='right')
TextL.grid(row=0)
L.filedir.grid(row=1, column=0, sticky='ew')
L.load_button.grid(row=1, column=1, sticky='w')
TextT.grid(row=2)
T.filedir.grid(row=3, column=0, sticky='ew')
T.load_button.grid(row=3, column=1, sticky='w')
TextD.grid(row=4)
D.selecdir.grid(row=5, column=0, sticky='ew')
D.load_button.grid(row=5, column=1, sticky='w')
b_validate.pack(side='left')
b_exit.pack(side='left')
root.mainloop()
最佳答案
关注@M.R.回答这个问题的建议和有用的陈述是:
我按功能检查了治疗功能的详细信息。看来(至少)有一个功能使整个事情不起作用。
这是一个调用 geopandas 和 shapely 的函数,之前曾出现过有关 pyproj 的错误;如果我自己调试失败,我可能会专门针对此事提出一个新问题(这与我在这里提出的问题相同:现在我的 python 脚本可以工作,我不明白为什么作为一个 exe突然就没有了)。在这种情况下,我将在此处链接下一个问题。
如果它可以帮助其他绝望的程序员,那么在调试过程中也对我有帮助的是:
事实上我的函数已经分离(这使得生成单独的 exe 更容易)
拥有一个最小的 GUI 将每个函数附带的可执行文件非常有用。如果有人遇到暗示用户输入的类似问题,请随意使用我发布的 GUI 代码作为布局(如果它可以节省您的时间)。您只需在开头添加您的函数,并更改您在 test()
部分中调用的内容(我在其中调用 add_data()
。
我还遵循了 How to debug small programs 的建议。这需要时间,但这是值得的。
关于python - 由 Pyinstaller exe 生成的带有 tkinter GUI 的 Exe 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57218891/
我想使用 li 和 ul 制作一个多级下拉列表,以便显示我博客中按年和月排序的所有文章。我希望我的下拉菜单看起来像 Google Blogspot 下拉菜单: 这是我的 CSS 和 HTML 代码 u
我在 Win 7 64 机器上将 CodeBlocks 与 gcc 4.7.2 和 gmp 5.0.5 结合使用。开始使用 gmpxx 后,我看到一个奇怪的段错误,它不会出现在 +、- 等运算符中,但
我正在使用 tern 为使用 CodeMirror 运行的窗口提供一些增强的智能感知,它工作正常,但我遇到了一个问题,我想添加一些自定义“types”,可以这么说,这样下拉列表中它们旁边就有图标了。我
我正在尝试让我的 PC 成为 Android 2.3.4 设备的 USB 主机,以便能够在不需要实际“附件”的情况下开发 API。为此,我需要将 PC 设置为 USB 主机和“设备”(在我的例子中是运
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
我在设置服务器方面几乎是个新手,但遇到了一个问题。我有一个 Ubuntu 16.04 VPS 并安装了 Apache2 和 Tomcat7。我正在为 SSL 使用 LetsEncrypt 和 Cert
我在一个基于谷歌地图的项目上工作了超过 6 个月。我使用的是 Google Maps API V1 及其开发人员 API key 。当我尝试发布应用程序时,我了解到 Google API V1 已被弃
我是 Python 的新手,所以如果我对一些简单的事情感到困惑,请原谅。 我有一个这样的对象: class myObject(object): def __init__(self):
这个问题已经有答案了: How can I access object properties containing special characters? (2 个回答) 已关闭 9 年前。 我正在尝
我有下面的 CSS。我想要的是一种流体/液体(因为缺乏正确的术语)css。我正在为移动设备开发,当我改变模式时 从纵向 View 到陆地 View ,我希望它流畅。现在的图像 在陆地 View 中效
我正在尝试使用可以接受参数的缓存属性装饰器。 我查看了这个实现:http://www.daniweb.com/software-development/python/code/217241/a-cac
这个问题在这里已经有了答案: Understanding slicing (36 个答案) 关闭 6 年前。 以a = [1,2,3,4,5]为例。根据我的直觉,我认为 a[::-1] 与 a[0:
mysqldump -t -u root -p mytestdb mytable --where=datetime LIKE '2014-09%' 这就是我正在做的事情,它会返回: mysqldum
我正在制作销售税计算器,除了总支付金额部分外,其他一切都正常。在我的程序中,我希望能够输入一个数字并获得该项目的税额我还希望能够获得支付的总金额,包括交易中的税金。到目前为止,我编写的代码完成了所有这
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
我是否必须进行任何额外的设置才能让 apache-airflow 在任务失败时向我发送电子邮件。我的配置文件中有以下内容(与默认值保持不变): [email] email_backend = airf
这个问题在这里已经有了答案: What does the $ symbol do in VBA? (5 个回答) 3年前关闭。 使用返回字符串(如 Left)的内置函数有什么区别吗?或使用与 $ 相同
我有一个用VB6编写的应用程序,我需要使用一个用.NET编写的库。有什么方法可以在我的应用程序上使用该库吗? 谢谢 最佳答案 这取决于。您可以控制.NET库吗? 如果是这样,则可以修改您的库,以便可以
当我创建一个以 ^ 开头的类方法时,我尝试调用它,它给了我一个错误。 class C { method ^test () { "Hi" } } dd C.new.test; Too m
我已经使用 bower 安装了 angularjs 和 materialjs。 凉亭安装 Angular Material 并将“ngMaterial”注入(inject)我的应用程序,但出现此错误。
我是一名优秀的程序员,十分优秀!