将 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的主要内容,如果未能解决你的问题,请参考以下文章
将 protobuf-net RuntimeTypeModel 编译为 C#,而不是 DLL