关于pyinstaller报错Permission denied

2,064 阅读3分钟

说到python的一键打包的工具,比较有名的是pyinstaller

然而我第一次用pyinstaller就卡在了PermissionError上。

在网上查了一下,也有很多人跟我遇到了同样的问题,因此我决定在此记录一下解决这个问题的过程,希望能够帮助到将来遇上同样问题的人。

我的版本信息是:

python        3.9.2
pip           21.0.1
pyinstaller   4.3

我的需求是打包一个路径里的所有文件爲一個單獨的執行文件。(打包单个py文件没有遇到同样的问题)

打包指令:

pyinstaller -F 项目路径/*

错误代码如下:

$ pyinstaller -F -w pythonTest/*
62 INFO: PyInstaller: 4.3
62 INFO: Python: 3.9.2
62 INFO: Platform: Windows-10-10.0.19041-SP0
62 INFO: wrote C:\projects\build.spec
62 INFO: UPX is not available.
62 INFO: Extending PYTHONPATH with paths
['C:\\projects\\pythonTest',
 'C:\\projects\\pythonTest',
 'C:\\projects\\pythonTest',
 'C:\\projects\\pythonTest',
 'C:\\projects\\pythonTest',
 'C:\\projects\\pythonTest',
 'C:\\projects\\pythonTest',
 'C:\\projects']
78 INFO: checking Analysis
78 INFO: Building Analysis because Analysis-00.toc is non existent
78 INFO: Initializing module dependency graph...
78 INFO: Caching module graph hooks...
93 WARNING: Several hooks defined for module 'win32ctypes.core'. Please take care they do not conflict.
93 INFO: Analyzing base_library.zip ...
1765 INFO: Processing pre-find module path hook distutils from 'c:\\program files\\python39\\lib\\site-packages\\PyInstaller\\hooks\\pre_find_module_path\\hook-distutils.py'.
1765 INFO: distutils: retargeting to non-venv dir 'c:\\program files\\python39\\lib'
3890 INFO: Caching module dependency graph...
4093 INFO: running Analysis Analysis-00.toc
4109 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable
  required by c:\program files\python39\python.exe
4187 WARNING: lib not found: api-ms-win-core-path-l1-1-0.dll dependency of c:\program files\python39\python39.dll
4375 INFO: Analyzing C:\projects\pythonTest\build
Traceback (most recent call last):
  File "c:\program files\python39\lib\runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "c:\program files\python39\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "C:\Program Files\Python39\Scripts\pyinstaller.exe\__main__.py", line 7, in <module>
  File "c:\program files\python39\lib\site-packages\PyInstaller\__main__.py", line 114, in run
    run_build(pyi_config, spec_file, **vars(args))
  File "c:\program files\python39\lib\site-packages\PyInstaller\__main__.py", line 65, in run_build
    PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)
  File "c:\program files\python39\lib\site-packages\PyInstaller\building\build_main.py", line 737, in main
    build(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build'))
  File "c:\program files\python39\lib\site-packages\PyInstaller\building\build_main.py", line 684, in build
    exec(code, spec_namespace)
  File "C:\projects\build.spec", line 7, in <module>
    a = Analysis(['pythonTest\\build', 'pythonTest\\README.md', 'pythonTest\\requirements.txt', 'pythonTest\\resource', 'pythonTest\\setting.csv', 'pythonTest\\src', 'pythonTest\\venv'],
  File "c:\program files\python39\lib\site-packages\PyInstaller\building\build_main.py", line 242, in __init__
    self.__postinit__()
  File "c:\program files\python39\lib\site-packages\PyInstaller\building\datastruct.py", line 160, in __postinit__
    self.assemble()
  File "c:\program files\python39\lib\site-packages\PyInstaller\building\build_main.py", line 414, in assemble
    priority_scripts.append(self.graph.run_script(script))
  File "c:\program files\python39\lib\site-packages\PyInstaller\depend\analysis.py", line 303, in run_script
    self._top_script_node = super(PyiModuleGraph, self).run_script(
  File "c:\program files\python39\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 1407, in run_script
    with open(pathname, 'rb') as fp:
PermissionError: [Errno 13] Permission denied: 'C:\\projects\\pythonTest\\build'

看了下代码,在试图打开路径时出现权限不允许的报错,非常奇怪。

网上查了解决方案:

  • 在项目上层的路径里执行Pyinstaller
  • 管理者模式的powershell里执行Pyinstaller
  • 在命令前加上pyhon -m:显示No module named Pyinstaller
  • 接上,pip list显示确实存在pyinstaller
  • 接上,将一部分字母改成大写,python -m PyInstaller -D 项目路径:可以执行,但还是Permission denied
  • 关闭所有需要打包的文件
  • 升级pip,重新安装pyinstaller

以上这些方法都没有用!

最后,我尝试着把路径下所有的文件夹都删除,文件全部置于根目录下然后再次执行上面的指令。

这一次成功了!

看到网上也有人反映,这个报错很有可能是一次版本更新的产物,只能希望路径打包能在下一次升级时修好吧。