【问题标题】:Modules not found after running pyinstaller运行 pyinstaller 后找不到模块
【发布时间】:2022-04-20 00:32:18
【问题描述】:

我现在为这篇长文道歉。

我正在使用 pyinstaller 将 Hello World 程序从 Python 文件转换为独立的、可分发的可执行文件。我在 Windows 10 Enterprise 上使用 pyinstaller 3.6。 Python 代码是使用 Spyder 4.0.1 编写的(我目前无法更新到 4.1.3)。

我已经创建了 HelloWorld.py 文件:

#! python3
# -*- coding: utf-8 -*-
"""
Created on Tue Jun 30 12:27:20 2020

@author: DNICHOL3
"""


def main():
    print("Hello World!")


if __name__ == "__main__":
    main()

以及同一个文件夹中的 cli.py 文件:

# -*- coding: utf-8 -*-
"""
Created on Tue Jun 30 09:07 2020

@author: DNICHOL3
"""


# import HelloWorld
from HelloWorld.__main__ import main

if __name__ == '__main__':
    main()

我正在运行带有 –onefile –debug 导入 –clean 标志的 pyinstaller:

pyinstaller cli.py –onefile –debug imports --clean

然后我从 dist 文件夹运行 cli.exe,并得到几个屏幕输出(import xxx、#clear yyy、#restore zzz、#cleanup [2] aaa)。此输出中嵌入了以下几行:

HelloWorld not found in PYZ
Traceback (most recent call last):
   File “cli.py”, line 10, in <module>
   File “<frozen importlib.bootstrap>”, line 991, in _find_and_load
   File “<frozen importlib.bootstrap>”, line 961, in _find_and_load_unlocked
   File “<frozen importlib.bootstrap>”, line 219, in _call_with_frames_removed
   File “<frozen importlib.bootstrap>”, line 991, in _find_and_load
   File “<frozen importlib.bootstrap>”, line 973, in _find_and_load_unlocked
ModuleNotFoundError: No module named ‘HelloWorld’
[21600] Failed to execute script cli

查看warn-cli.txt显示确实缺少HelloWorld:

Missing module named ‘HelloWorld.__main__’ imported by C:\Users\dnichol3\python\Utilities\cli.py (top-level)

而且 cli.spec 似乎表明 PYZ 中缺少 HelloWorld:

pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)

执行生成的cli.exe遇到错误提示:

   File “cli.py”, line 10, in <module>
ModuleNotFoundError: No module named ‘HelloWorld’

我已经阅读了 pyinstaller 文档(当事情出错时)。我试图通过使用 –hidden_​​import 标志将 HelloWorld.py 包含到我的 pyinstaller 命令中,但这始终以 pyinstaller: error: unrecognized arguments: --hidden_​​import 结尾。而且,hidden_​​import 和 HelloWorld 之间是否使用等号无关紧要,是否使用 .py 文件扩展名也无关紧要。

我尝试了其他一些 Stack Overflow 建议(https://stackoverflow.com/a/46894037/12344177https://stackoverflow.com/a/41869771/12344177https://stackoverflow.com/a/47337389/12344177)无济于事。 任何帮助将不胜感激。

【问题讨论】:

    标签: pyinstaller


    【解决方案1】:

    我认为这不是 pyinstaller 问题,而是属于您的导入问题。试试这个不带 .__main__ 的 cli.py 这意味着你从 HelloWorld.py 导入 main()。

        # -*- coding: utf-8 -*-
        """
        Created on Tue Jun 30 09:07 2020
    
        @author: DNICHOL3
        """
    
    
        # import HelloWorld
        from HelloWorld import main
    
        if __name__ == '__main__':
            main()
    

    【讨论】:

    • 感谢您的意见,flipSTAR。这正是问题所在。程序现在打印“Hello World”。现在我需要确定如何抑制所有其他输出(“#cleanup”、“#destroy”等)。
    • 试试这个:pyinstaller cli.py --onefile --clean
    • 你又来了!非常感谢。
    【解决方案2】:

    嗨,我希望这还不算太晚。我也在这个话题上挣扎了好几天。浏览了文档,发现了这个section

    我的问题略有不同,我的文件夹结构如下:

    my_package/
    ├── setup.py
    ├── my_package/
    │   ├── file_1.py
    │   ├── file_2.py
    
    

    另外,我在安装了pyinstaller 的环境中执行了pip install . 其中setup.py

    file_1.py 我有以下等价物:

    from my_package.file_2 import some_function
    
    def foo():
        print('hello world')
        some_function()
    
    
    foo()
    

    当我运行我的 .exe 文件时,我一直遇到ModuleNotFoundError 问题。上述部分的解决方案是,在file_1.py 所在的文件夹中:

    pyinstaller file_1.py -F --collect-all my_package
    

    这很有效。不能说我真正理解文档中的所有内容,但是……它有效,希望它也适用于你……如果这还不算太晚:)

    【讨论】:

      猜你喜欢
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 2021-01-02
      • 2023-01-05
      相关资源
      最近更新 更多