将 Python 代码编译为 Pascal DLL

Posted

技术标签:

【中文标题】将 Python 代码编译为 Pascal DLL【英文标题】:Compile Python Code to Pascal DLL 【发布时间】:2013-09-23 12:50:09 【问题描述】:

我有一个用Free Pascal 编写的程序。它从运行时选择的 DLL 中导入函数。它们是使用 pascal; 关键字导入的。我想使用 python 代码扩展这个程序。我发现shedskin 在这种情况下可能对我有帮助。我需要如何进行?事实上,我想“将 python 代码编译为 DLL”。除了任何免费或开源工具/编译器之外,我还可以使用 Microsoft Visual Studio 2012 和 VC++ 来解决我的问题。

【问题讨论】:

【参考方案1】:

假设Pascal可以使用c外部函数,直接使用python c-api是可能的。我认为您的第一步是了解用于将 cpython 嵌入其他应用程序的 api python 公开。

http://docs.python.org/2/extending/

【讨论】:

Free Pascal 还支持 ActiveX IDispatch 接口,例如 Delphi。这有时更方便与脚本语言交互。也许看看各种 DelphiPython 桥接器会更明智。【参考方案2】:

pascal 修饰符是calling convention 的声明。参数从左到右压入堆栈。与 cdecl 调用约定相比,其中参数从右到左推送以支持 C 中的 variadic 函数。stdcall 修饰符是另一个从右到左的调用约定。

Free Pascal 支持这两种调用约定。这是免费帕斯卡的cdecl、stdcall 和pascal。调用约定绝对不兼容。如果你调用一个预期的函数,它的参数以某种顺序排列,而堆栈以另一种顺序排列——就会发生不好的事情。

您可能需要使用 cdecl 来使用 Python 扩展 Free Pascal,该 Python 已编译为带有 shedskin 的 C++ 代码。我认为 all Windows DLL 使用帕斯卡转换,而不管 DLL 是用什么语言编写的。

因此,请确保您使用正确的调用约定 - 取决于您使用代码的位置。

【讨论】:

Afaik Pascal在 Free Pascal 上的标准调用。对于 Windows dll,您需要 stdcall。 freepascal.org/docs-html/ref/refsu79.html#x183-19300014.9.16

以上是关于将 Python 代码编译为 Pascal DLL的主要内容,如果未能解决你的问题,请参考以下文章

VC将同一份代码同时编译为Dll和Exe的方法

将 protobuf-net RuntimeTypeModel 编译为 C#,而不是 DLL

用于 C++ 的 C# 包装器,但仅编译为静态库

protocol buffer如何将输出文件编译为DLL

将python代码编译为PyCodeObject并编组为pyc文件

如何在 Visual Studio 2010 Express 中将 cpp 编译为 dll