尝试使用 PyInstaller 时出现权限错误

新手上路,请多包涵

尝试使用 PyInstaller 部署 Kivy 应用程序时,即使使用 Administrator CMD,我也会收到 Permission Denied 错误。该文件夹为每个用户提供了所有打开的编辑选项。 Python 具有防火墙访问权限。如何解决这个问题?

 PS C:\Users\theguy\Documents\Python\myapp-build> python -m PyInstaller --name "MyApp" "./"
422 INFO: PyInstaller: 3.3.1
422 INFO: Python: 3.6.5
424 INFO: Platform: Windows-10-10.0.17134-SP0
425 INFO: wrote C:\Users\theguy\Documents\Python\myapp-build\myapp.spec
426 INFO: UPX is not available.
427 INFO: Extending PYTHONPATH with paths
['C:\\Users\\theguy\\Documents\\Python',
 'C:\\Users\\theguy\\Documents\\Python\\myapp-build']
428 INFO: checking Analysis
428 INFO: Building Analysis because out00-Analysis.toc is non existent
429 INFO: Initializing module dependency graph...
432 INFO: Initializing module graph hooks...
434 INFO: Analyzing base_library.zip ...
3859 INFO: running Analysis out00-Analysis.toc
3861 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable
  required by C:\Anaconda3\python.exe
4398 INFO: Caching module hooks...
4402 INFO: Analyzing C:\Users\btdav\Documents\Python\
Traceback (most recent call last):
  File "C:\Anaconda3\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "C:\Anaconda3\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Anaconda3\lib\site-packages\PyInstaller__main__.py", line 101, in <module>
    run()
  File "C:\Anaconda3\lib\site-packages\PyInstaller__main__.py", line 94, in run
    run_build(pyi_config, spec_file, **vars(args))
  File "C:\Anaconda3\lib\site-packages\PyInstaller__main__.py", line 46, in run_build
    PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)
  File "C:\Anaconda3\lib\site-packages\PyInstaller\building\build_main.py", line 791, in main
    build(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build'))
  File "C:\Anaconda3\lib\site-packages\PyInstaller\building\build_main.py", line 737, in build
    exec(text, spec_namespace)
  File "<string>", line 16, in <module>
  File "C:\Anaconda3\lib\site-packages\PyInstaller\building\build_main.py", line 213, in __init__
    self.__postinit__()
  File "C:\Anaconda3\lib\site-packages\PyInstaller\building\datastruct.py", line 161, in __postinit__
    self.assemble()
  File "C:\Anaconda3\lib\site-packages\PyInstaller\building\build_main.py", line 415, in assemble
    priority_scripts.append(self.graph.run_script(script))
  File "C:\Anaconda3\lib\site-packages\PyInstaller\depend\analysis.py", line 201, in run_script
    self._top_script_node = super(PyiModuleGraph, self).run_script(pathname)
  File "C:\Anaconda3\lib\site-packages\PyInstaller\lib\modulegraph\modulegraph.py", line 1334, in run_script
    with open(pathname, 'rb') as fp:
PermissionError: [Errno 13] Permission denied: 'C:\\Users\\theguy\\Documents\\Python\\myapp-build'

原文由 The Guy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

诀窍是在您正在构建的目录之外创建一个新目录,然后像下面的代码一样使构建引用 Kivy 应用程序的 main.py。这修复了权限错误,即使是来自常规 CMD。

 PS C:\Users\theguy\Documents\Python\myapp-build> python -m PyInstaller --name "MyApp" "C:\Users\theguy\Documents\Python\myapp\main.py"

原文由 The Guy 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果有人遇到我的情况,我会给出这个答案。我花了很多时间尝试此处介绍的其他建议解决方案。但是,没有人解决我的文件权限错误。此外,虽然我下面的解决方案对我有用,但我仍然不明白为什么我首先会收到权限错误。

请注意,我使用 pyenv 来管理多个发行版,但我认为这与问题无关。此外,Pyinstaller 在我使用它的几个不同的 python 版本中以同样的方式失败。

另外,请注意,我知道我修改包源的答案是 “错误的做法” ,但它适用于我的边缘情况并允许我继续前进。

尝试构建单个文件可执行文件时,当 PyInstaller 尝试访问创建的 .exe 以添加最终负载数据时,我不断收到 PermissionError: [Errno 13] Permission denied 问题。如前所述,我尝试了在此处的其他答案中找到的所有权限/管理员/禁用防御者技巧,但大多数时候,构建过程一直失败并出现文件权限错误。然而,我确实注意到,有时,PyInstaller 会在极少数情况下正确构建可执行文件,可能每二十次就有一次,我无法解释。最后,一时兴起,我决定直接修改 PyInstaller,让构建过程多尝试几次最后的追加。

我修改了一个 PyInstaller 源文件 api.py ,尝试将最终包追加最多十次。进行此更改后,构建过程会在第二次或第三次成功。通过此更改,第一次或第二次追加尝试通常会因相同的权限错误而失败,但第二次或第三次会成功,并且可正确构建可执行包。

我在第 737 行更改了 PyInstallers api.py:

else:
    # Fall back to just appending data at the end of the file
    logger.info("Appending %s to EXE", append_type)
    with open(self.name, 'ab') as outf:
        with open(append_file, 'rb') as inf:
            shutil.copyfileobj(inf, outf, length=64 * 1024)

else:
    desparation = 10
    while desparation:
        desparation -= 1
        try:
            # Fall back to just appending data at the end of the file
            logger.info("Appending %s to EXE", append_type)
            with open(self.name, 'ab') as outf:
                with open(append_file, 'rb') as inf:
                    shutil.copyfileobj(inf, outf, length=64 * 1024)
            desparation = 0
        except PermissionError as e:
            logger.error(e)

原文由 Seth Stenzel 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进