无法在其他计算机上运行.exe文件 - 出现“没有名为serial的模块”错误

3
系统: Python 3.7 64x 运行在 Windows 10 上。我也安装了 Anaconda,并通过 VS Code 进行编程。所有模块都已安装、验证并且是最新的。
我编写了一个脚本,并使用 pyinstaller 将其编译成 .exe 文件。pyinstaller -wFi pyico.ico endpointapp3.py。这个 .exe 文件可以在我的电脑上运行,但它不是为我的电脑而设计的。此脚本的之前版本已被编译、测试并成功地在目标计算机上(一台没有安装 Python 的 Windows 7 计算机)运行。
我的最新版本现在包括 pyserial,并且再次可以在我的电脑上运行,但是在为目标计算机编译和创建 .exe 文件后,我遇到了这个错误。
File "endpointapp2.py", line 9 in <module> 
ModuleNotFoundError: No module named 'serial' 
[3512] Failed to execute script endpointapp2.py

第9行是我的import serial代码行。

如我之前所述,该可执行文件在我的电脑上可以运行,但在它被设计用于的目标机器上却不能。我不想在目标机器上安装Python或Python模块,因为我希望.exe是包含所有必要内容的完整程序。

问题:

  1. 为什么我会收到这个错误?这意味着什么?
  2. 是否有一种解决方案,允许我将所有必要模块信息编译到一起(使用pyinstaller),并将其保存在.exe中?
  3. 是否还需要在我的原始脚本中添加其他内容,以便让我通过这个问题?

不是重复 - 这篇文章是为了在另一台机器上编译和运行 Python .exe 文件,独立于 Python,并且没有安装任何模块或 Python。


@martineau 完成 - undefined
@martineau 这不是我.py文件中的一行代码。这是我在Python中键入的命令,用于将我的.py脚本编译成.exe可执行文件。这就是我使用pyinstaller所做的全部工作。这实际上是我唯一一次输入pyinstaller或使用该模块的时候。 - undefined
1
好的,这就是我想知道的。显然,pyinstaller默认的方式在构建Python脚本生成.exe文件时,并没有包含你正在使用的第三方serial模块。那么这个模块到底是什么,你是从哪里获取的(或者它是Anaconda的一部分)?注意:这是pyinstaller的手册,你可以参考一下。 - undefined
1
这是 PyInstaller 手册的一个 章节,描述了它如何尝试确定您的脚本使用了哪些导入(以及如何在缺失时“帮助”它)。相关的 页面 显示了它所理解的模块,最接近的是 "PySerial",听起来使用它应该可以正常工作,无需额外操作——所以问题变成了为什么 PyInstaller 在这种情况下不能正常工作? - undefined
不客气...我想一下——你是在哪台机器上执行了pip install pyserial命令?因为如果是另外一台机器(假设你自己的机器上已经安装了该模块),那么pyinstaller可能无法正常工作,而安装缺失模块的pip命令只是解决实际问题的权宜之计。 - undefined
显示剩余9条评论
4个回答

1

当我将代码移动到串行模块位置时,我解决了这个问题。 首先找到串行模块的位置:

>>> import serial
>>> serial.__file__
'C:\\Program Files\\Python310\\lib\\site-packages\\serial\\__init__.py'

我的在上面。

然后将你的文件移动到:

'C:\\Program Files\\Python310\\lib\\site-packages\\{your_file.py}'

然后运行 pyinstaller:

pyinstaller --onefile your_file.py --additional-hooks-dir serial\\__init__.py

从dist文件夹中运行你的.exe文件。不再显示错误。

1

如果链接被删除了,那么它的要点是什么? - undefined
https://dev59.com/j53ha4cB1Zd3GeqPUXCW#69509753 - undefined

1

在得到一些协助和有用的建议(感谢martineau),我成功解决了我的问题。当使用pyinstaller编译时,它会生成一个.spec文件,实际上用于编译成.exe。

这里我找到了确保我添加了pyinstaller所需文件的必要步骤。

这里我了解到如何正确地将模块信息添加到我的编译代码中。

一旦pyinstaller的.spec文件中有了正确的信息,我就能够按预期在目标计算机上进行编译和执行。


-2

这个模块被称为pyserial,但是代码中的库调用是import serial。Pyinstaller无法完成构建,因为真的没有名为serial的模块。

为了纠正这个问题,您需要告诉pyinstaller导入正确的包,通过将其包含在.spec文件的hiddenimports下。

hiddenimports=['pyserial']

对于任何包名称和导入语句不相同的情况,都是如此。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接