首页 > 解决方案 > 以编程方式为基于 Python 的 OpenGL 程序设置 NvOptimusEnablement

问题描述

有没有办法在 Python 脚本中使用 OpenGL(尤其是使用 Qt 的应用程序)以编程方式为基于 Python 的应用程序设置 NvOptimusEnablement 标志?

到目前为止,我看到的所有参考资料——例如在 nVidia Optimushttps://stackoverflow.com/a/39047129/6531515中以编程方式选择集成显卡——都是针对 C/C++ 的,其中标志需要设置为全局定义哪个编译成可执行文件,但显然在这种情况下不起作用。

是唯一的选择:

  1. 使用此标志集创建自定义 Python 解释器包装器(例如https://github.com/cprogrammer1994/optimuspy),或者
  2. 强制用户将 Python / pyinstaller-created-binary 显式标记为需要他们使用的每台机器的 Nvidia GPU?

标签: pythonopenglpyqt5nvidiaoptimus

解决方案


问题是在创建进程时系统必须知道这些标志。这是有道理的,因为此时可以开始分配 GPU 资源。它们仅在从运行的可执行文件或静态链接到它的库中公开时才起作用,它不适用于动态链接的库。

因此,除了运行已使用此标志编译的 Python 解释器,或Python.exe从 Nvidia 控制面板配置应使用的图形处理器外,别无他法。

但是,当您使用 pyinstaller 发布应用程序时,可以编译引导加载程序以公开这些标志,因为它是程序的入口点。您只需将其添加到 main.c 中:(或使用我的 pyinstaller 分支:https ://github.com/pvallet/pyinstaller )

__declspec(dllexport) unsigned long NvOptimusEnablement = 0x00000001;
__declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;

这篇文章解释了如何做到这一点:如何重新编译 Pyinstaller 的引导加载程序


推荐阅读