0

使用在 32 位平台上运行良好但在 64 位平台上运行失败的 Python 代码。代码中除了 ctypes 之外还有 Win32API 调用。如何本地化只能在 32 位平台上运行的代码?如果您尝试重写 32 位代码以在 64 位系统上运行,您会从哪里开始以及如何开始?

4

1 回答 1

3

并非所有 32 位 WinAPI 函数的工作方式都与它们的 64 位对应函数相同。还有一些 API 已被弃用,一些已弃用 Win32 的 API 已被删除(请参阅Wikipedia)。

在调用此类 API 的情况下(在 32 位和 64 位系统上的行为会有所不同),这将有助于将常见的 python 逻辑重构为一个单独的单元(python 类、模块或函数)——比如在为了讨论,模块common.py 。理想情况下,所有平台特定的逻辑都应该放在两个单独的单元中(一个用于 32 位,另一个用于 64 位)——比如platform_win32.pyplatform_win64.py

然后,加载期间的 common.py文件可以根据平台检查动态导入platform_win32.pyplatform_win64.py 。一旦导入了适当的模块,common.py就可以调用平台特定的逻辑来执行它的任务。

这也指出了编写跨平台代码时的一个重要设计原则——永远不要在业务逻辑中直接调用特定于平台的代码。始终将您的平台特定逻辑包装在单独的模块/类中,并将这些功能作为 API 公开。确保此 API 在 32 位和 64 位版本中具有相同的签名。然后您可以有条件地导入这些 API 并调用它们。这种方法的美妙之处在于平台检查可以在程序引导期间完成,然后加载适当的 API。一旦发生这种情况,调用这些 API 的代码将被确保触发了正确的平台特定逻辑。这消除了对if platform == 'x64': else:类型检查的需要,以免散布在代码中。

最后,作为一个事后的想法:在处理核心 Win32 API 时使用一些像PyWin32这样的良好测试库。它已经同时支持 32 位和 64 位,然后您的工作就减少到只与您的应用程序一起提供正确版本的 pywin32。

希望这可以帮助。

于 2013-08-04T09:25:14.427 回答