说到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
以上这些方法都没有用!
最后,我尝试着把路径下所有的文件夹都删除,文件全部置于根目录下然后再次执行上面的指令。
这一次成功了!
看到网上也有人反映,这个报错很有可能是一次版本更新的产物,只能希望路径打包能在下一次升级时修好吧。