5

我一直在玩pyglet。这是很不错的。但是,如果我运行我的代码,该代码位于一个可执行文件(称为 game.py)中,前缀通常为

#!/usr/bin/env python

通过做

./game.py

然后有点笨拙。但是如果我运行它

python -O ./game.py

或者

PYTHONOPTIMIZE=1 ./game.py

然后它的超级光滑。

我不太在乎为什么它在没有优化的情况下运行缓慢;pyglet 的文档提到优化会禁用许多断言以及 OpenGL 的错误检查,我很高兴将其保留在此。

我的问题是:分发 Python 代码的人如何确保最终用户(对调试或修改代码的兴趣为零)运行代码的优化版本。除了告诉人们确保他们在发行说明中使用优化(他们可能无论如何都不会阅读)之外,肯定有更好的方法吗?

在 Linux 上,我可以轻松地提供一个./game脚本来为最终用户运行该文件:

#!/bin/sh
PYTHONOPTIMIZE=1 ./game.py $*

但这不是很跨平台。

我有一个想法,我应该能够将#!线路更改为

#!/usr/bin/env PYTHONOPTIMIZE=1 python

或者

#!/usr/bin/env python -O

但这些似乎没有按预期工作,我不确定他们会在 Windows 上做什么。

是否有某种方法可以从我不知道的代码中控制优化?就像是:

  import runtime
  runtime.optimize(True)

运送多平台 python 代码的人们认为该领域的最佳实践是什么?

4

2 回答 2

14

“在 Linux 上,我可以轻松地提供一个 ./game 脚本来为最终用户运行文件:”

正确的。

“但这不是很跨平台。”

对了一半。有两种 shell 语言很重要。标准 Linux "sh" 和非标准 Windows "bat" (a/k/a cmd.exe),这就是现在的全部。[当我还是个孩子的时候,有 Open VMS DCL 和 Data General 奇怪的 shell 语言和 RSX-11 以及各种很棒的东西。感谢上帝的 Posix 标准。]

游戏.sh

python -O game.py

游戏.bat

python -O game.py

有趣的是,文件是相同的,只有扩展名(和文件格式)必须更改才能使各种操作系统满意。

如果你想要真正一刀切的跨平台,你必须记住 Python 是一种 shell 语言。这种事情也有效。

游戏启动.py

import subprocess
subprocess.Popen( "python -O game.py" )
于 2009-07-07T13:11:41.750 回答
2

回答您的问题(与解决您的问题相反,S. Lott 做得很好),我认为很多时候分发 Python 代码的人并不担心这一点,因为优化标志很少有任何效果。我相信 Pyglet 是我多年来使用 Python 时听到的唯一例外。引用Python 文档“优化器目前没有多大帮助;它只删除了断言语句”。

于 2009-07-08T10:25:15.147 回答