以编程方式为基于 Python 的 OpenGL 程序设置 NvOptimusEnablement

Programically setting NvOptimusEnablement for Python-based OpenGL Programs

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

到目前为止我看到的所有参考资料 - 例如Programmatically selecting integrated graphics in nVidia Optimus, or - 用于 C/C++,其中标志需要设置为编译到可执行文件中的全局定义,但显然在这种情况下不起作用。

唯一的选择是:

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

问题是创建进程时系统必须知道这些标志。这是有道理的,因为此时可以开始分配 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;

这篇 post 解释了如何操作:how to recompile the bootloader of Pyinstaller