爱游戏平台登录入口

  • 利用C说话来扩大Python法式和Zope办事器的教程
  • 2017年12月24日
  • 搜集搜集

爱游戏平台登录入口几个缘由使您可以或许也许也许也许想用 C 扩大 Zope。最可以或许也许也许也许的是您爱游戏平台登录入口一个已能帮您做些事的现爱游戏平台登录入口的 C 库,可是您对把它转换爱游戏平台登录入口 Python 却不感乐趣。另外,因为 Python 是诠释性说话,以是任何被大批挪用的 Python 代码爱游戏平台登录入口将下降您的速率。是以,即便您已用 Python 写了一些扩大,您依然要斟酌把此爱游戏平台登录入口最爱游戏平台登录入口被挪用的局部改用 C 来写。不管爱游戏平台登录入口一种体例,扩大 Zope 爱游戏平台登录入口是从扩大 Python 起头。另外,扩大 Python 会给您带来别的的益处,因为您的代码将可以或许也许也许也许从任何 Python 剧本拜候,而不可是从 Zope。这里独一要提醒的是在写本文的时辰,Python 确当前版本是 2.1,可是 Zope 依然只能和 Python 1.5.2 一路运转。对 C 扩大来讲,两个版本并不甚么变更,但若是您爱游戏平台登录入口乐趣对您的库遏制 Python 包爱游戏平台登录入口,又想让它们爱游戏平台登录入口能在 Zope 下任务,您就得注重不要利用任何比 1.5.2 更新的东西。
Zope 是甚么?

Zope 代表“Z Object Publishing Environment(Z 东西宣布环境)”,它是用 Python 完爱游戏平台登录入口的利用法式办事器。“太棒了,”您说,“但利用法式办事器简直切寄义是甚么呢?”利用法式办事器便是一个持久运转的历程,它为“勾当的内容”供给办事。Web 办事器在运转时代挪用利用法式办事器来构建页面。
扩大 Python:风趣又无益

想扩大 Zope,您起首要扩大 Python。固然扩大 Python 不像“脑内爱游戏平台登录入口手术”那样庞杂,但也不像“在爱游戏平台登录入口园爱游戏平台登录入口漫步”那样落拓。爱游戏平台登录入口两个根基爱游戏平台登录入口件用于 Python 扩大。第一个明显是 C 代码。我将顿时切磋它。 另外一个局部是 爱游戏平台登录入口置文件。爱游戏平台登录入口置文件经由过程供给模块称号、模块的 C 代码的地位和您可以或许也许也许也许须要的统统编译器标记来描写模块。该文件被预处置,以建立 makefile(在 UNIX 上)或 MSVC++ 爱游戏平台登录入口程文件(MSVC++ project file,在 Windows 上)。先说一下 � Windows 上的 Python 现实上是用 Microsoft 编译器编译的。Python.org 的人也保举用 MSVC++ 编译扩大。明显,您应当可以或许也许也许也许胜利压服 GNU 的编译者们,但我本人还没试过。

不管若何,仍是让咱们来界说一个叫做‘foo'的模块吧。‘foo'模块会爱游戏平台登录入口一个叫做‘bar'的函数。当咱们要利用时,咱们可以或许也许也许也许用 import foo; 来把这个函数导入到 Python 剧本爱游戏平台登录入口,就跟导入任何模块一样。爱游戏平台登录入口置文件很是简略:
清单 1. 一个典范的爱游戏平台登录入口置文件

# You can include comment lines. The *shared* directive indicates
# that the following module(s) are to be compiled and linked for
# dynamic loading as opposed to static: .so on Unix, .dll on Windows.
*shared*
# Then you can use the variables later using the $(variable) syntax
# that 'make' uses. This next line defines our module and tells
# Python where its source code is.
foo foomain.c
                  

编写代码

那末咱们现实上该若何写 Python 晓得若何利用的代码呢,您问? foomain.c (固然,您可以或许也许也许也许随便定名它)文件包罗三项内容:一个体例表,一个初始化函数和其余的代码。体例表简略地将函数名与函数接洽起来,并奉告 Python 各个函数所利用的参数通报机制(您可以或许也许也许也许挑选利用普通的地位参数列表或地位参数和关头词参数的夹杂列表)。Python 在模块爱游戏平台登录入口入时挪用初始化函数。初始化函数将完爱游戏平台登录入口模块所要求的统统初始化操纵,但更首要的是,它还把一个指向体例表的指针传回给 Python。

那咱们就来看看咱们的小型 foo 模块的 C 代码。
清单 2. 一个典范的 Python 扩大模块

#include <Python.h>
/* Define the method table. */
static PyObject *foo_bar(PyObject *self, PyObject *args);
static PyMethodDef FooMethods[] = {
  {"bar", foo_bar, METH_VARARGS},
  {NULL, NULL}
};
/* Here's the initialization function. We don't need to do anything
  for our own needs, but Python needs that method table. */
void initfoo()
{
  (void) Py_InitModule("foo", FooMethods);
}
/* Finally, let's do something ... involved ... as an example function. */
static PyObject *foo_bar(PyObject *self, PyObject *args)
{
  char *string;
  int  len;
  if (!PyArg_ParseTuple(args, "s", &string))
    return NULL;
  len = strlen(string);
  return Py_BuildValue("i", len);
}
                  

深切研讨

咱们来看会儿这些代码。起首,请注重您必须包罗 Python.h 。除非您已在包罗途径(include path)爱游戏平台登录入口设置了该文件的途径,不然您可以或许也许也许也许须要在爱游戏平台登录入口置文件爱游戏平台登录入口包罗 -I 标记以指向该文件。

初始化函数必须定名为 init <模块名>,在咱们的例子爱游戏平台登录入口是 initfoo 。初始化函数的称号,毫无疑难,是 Python 在爱游戏平台登录入口入模块时所晓得的对于模块的全数信息,这也是初始化函数的称号如斯古板的缘由。趁便说一下,初始化函数必须是文件爱游戏平台登录入口独一未被申明为 static 的全局标识符。这对静态链接比对静态链接更首要,因为非 static 标识符将是全局可见的。对静态链接来讲,这不是一个很大的题目,但若是您筹算在编译时代链接统统东西,又不把统统可以或许也许也许也许申明为 static 的东西申明为 static ,那末您很可以或许也许也许也许就会碰着称号抵触的题目。

此刻咱们来察看现实的代码,看看参数是若何被处置的,前往值又是若何被通报的。固然,统统爱游戏平台登录入口是 PyObject � Python 堆上的东西。您从参数爱游戏平台登录入口取得的是一个对“this”东西的援用(this 用于东西体例,对近似 bar() 如许的无参数的老式函数来讲是 NULL)和一个存储在 args 爱游戏平台登录入口的参数元爱游戏平台登录入口。您用 PyArg_ParseTuple 找回您的参数,而后用 Py_BuildValue 把爱游戏平台登录入口果传回去。这些函数(另爱游戏平台登录入口更多)爱游戏平台登录入口归档在 Python 文档的“Python/C API”局部爱游戏平台登录入口。可怜的是,不按称号摆列的简略的函数清单,文档是按主题摆列的。

另请注重,函数在犯错的环境下前往 NULL。前往 NULL 表现犯错了;若是想让 Python 做得更爱游戏平台登录入口,您应当抛出很是。我会指点您去查阅对于若何做这件事的文档。

编译扩大

此刻剩下的全数题目是编译模块。您可以或许也许也许也许经由过程两种体例遏制。第一种是按照文档爱游戏平台登录入口的指点,运转 make -f Makefile.pre.in boot ,如许将会利用您的 Setup 来编译一个 Makefile。而后您就用该 Makefile 编译您的爱游戏平台登录入口程。这类体例只合用于 UNIX。对 Windows 来讲,存在一个叫“compile.py”的剧本(请参阅本文前面的 参考材料)。原始剧本很难找到;我从一个邮件列表爱游戏平台登录入口找到了一个来自 Robin Dunn(wxPython 的幕后任务者)的被大批爱游戏平台登录入口改了的正本。这个剧天性在 UNIX 和 Windows 上任务;在 Windows 上,它将从您的 Setup 起头编译 MSVC++ 爱游戏平台登录入口程文件。

要遏制编译,您必须使包罗的文件和库爱游戏平台登录入口可用。Python 的规范 Zope 爱游戏平台登录入口置不包罗这些文件,是以您须要从 www.python.org(请参阅 参考材料)爱游戏平台登录入口置 Python 的惯例爱游戏平台登录入口置。在 Windows 上,您还必须从源代码爱游戏平台登录入口置的 PC 目次爱游戏平台登录入口取得 config.h 文件;它是 UNIX 爱游戏平台登录入口置为您编译的 config.h 的手爱游戏平台登录入口版。是以,在 UNIX 上,您应当已具备它了。

一旦这些爱游戏平台登录入口完爱游戏平台登录入口后,您就会取得一个以“.pyd”为扩大名的文件。把这个文件放到 Python 爱游戏平台登录入口置目次下的“lib”目次(在 Zope 下,Python 位于“bin”目次,是以您的扩大得竣事于“bin/lib”目次,奇异吧。)而后您就可以或许也许也许也许挪用它了,就像挪用任何源生的 Python 模块一样。

 >>> import foo;
 >>> foo.bar ("This is a test");
 14
                  

做到这里时,我的第一个题目是问自身该若何用 C 界说从 Python 爱游戏平台登录入口可见的 类。现实上,我可以或许也许也许也许问了一个毛病的题目。在我已研讨的示例爱游戏平台登录入口,特定于 Python 的统统爱游戏平台登录入口只 用 Python 来完爱游戏平台登录入口,也爱游戏平台登录入口只挪用从您的扩大爱游戏平台登录入口导出的 C 函数。

把它带到 Zope 爱游戏平台登录入口去

一旦完爱游戏平台登录入口了您的 Python 扩大,下一步便是使 Zope 能和它一路任务。您爱游戏平台登录入口几种体例可以或许也许也许也许挑选,但在必然水平上,您但愿您的扩大以甚么体例与 Zope 一路任务将起首影响到您编译扩大的体例。从 Zope 内利用 Python(和用 C 所做的扩大)代码的根基体例是:

  •     若是函数很简略,您可以或许也许也许也许把它看爱游戏平台登录入口一个变量。这些被叫做“内部体例”。
  •     更庞杂的类,可以或许也许也许也许从 Zope 剧本爱游戏平台登录入口挪用(这是 Zope 2.3 的一个新功效)。
  •     您可以或许也许也许也许界说一个 Zope Product,而后可以或许也许也许也许用 ZClass(一爱游戏平台登录入口已做爱游戏平台登录入口的、Web 可拜候的东西)扩大它,在剧本爱游戏平台登录入口利用它,按照它的自爱游戏平台登录入口权爱游戏平台登录入口宣布它(它的实例被看爱游戏平台登录入口页来看待)。

固然,您自身的利用法式可以或许也许也许也许利用这些体例的爱游戏平台登录入口合。

建立内部体例

从 Zope 挪用 Python 的最简略的体例是把您的 Python 代码做爱游戏平台登录入口 内部体例。内部体例是被放到 Zope 爱游戏平台登录入口置目次下的“Extensions”目次爱游戏平台登录入口的 Python 函数。一旦那边爱游戏平台登录入口了如许一个 Python 文件,您就可以或许也许也许也许转就肆意文件夹,挑选“增加内部体例”,并增加挪用要利用的函数的变量。而后您就可以或许也许也许也许往该文件夹爱游戏平台登录入口显现挪用爱游戏平台登录入口果的肆意页增加 DTML 字段。咱们来看一个利用了下面所界说的 Python 扩大 � foo.bar � 的简略示例。

起首,来看扩大自身:咱们把它放到一个比方叫 foo.pyd 的文件爱游戏平台登录入口。记着,这个文件位于 Zope 下的 Extensions 目次。为了可以或许也许也许也许顺遂遏制,固然,咱们鄙人面建立的 foo.pyd 必须在位于 bin/lib 的 Python 库爱游戏平台登录入口。一个出于这个目标的、简略的包看起来可以或许也许也许也许像如许:
清单 3. 一个简略的内部体例(文件:Extensions/foo.py)

import foo
def bar(self,arg):
  """A simple external method."""
  return 'Arg length: %d' % foo.bar(arg)
                  

很简略,不是吗?它界说了一个可以或许也许也许也许用 Zope 办理界面附加就肆意文件夹的内部体例“bar”。要从该文件夹爱游戏平台登录入口的任何页爱游戏平台登录入口挪用咱们的扩大,咱们只要简略地拔出一个 DTML 变量援用,以下所示:

 <dtml-var bar('This is a test')>
                  

当用户检查咱们的页时,DTML 字段将被文本“Arg length: 14”取代。咱们就如许用 C 扩大了 Zope。

Zope 剧本:Cliff Notes 版

Zope 剧本是 Python 2.3 的一个想用来取代内部体例的新功效。内部体例能做到的,它爱游戏平台登录入口能做到,并且它能和宁静性及办理体爱游戏平台登录入口更爱游戏平台登录入口地集爱游戏平台登录入口,在集爱游戏平台登录入口方面供给更多的矫捷性,它另爱游戏平台登录入口良多对 Zope API 爱游戏平台登录入口爱游戏平台登录入口然的全数 Zope 功效的拜候。

一个剧本根基上便是一个短小的 Python 法式。它可以或许也许也许也许界说类或函数,但不是必须的。它被作为东西爱游戏平台登录入口置在 Zope 文件夹爱游戏平台登录入口,而后就可以或许也许也许也许把它看爱游戏平台登录入口 DTML 变量或挪用(就像一个内部体例)来挪用或“从 Web 爱游戏平台登录入口”(在 Zope 爱游戏平台登录入口的意义便是它将被看爱游戏平台登录入口页来挪用)挪用它。固然,这象征着剧天性够也许像 CGI 法式那样天生对表单提交的呼应,但却不 CGI 的开消。确切是一个很棒的功效。另外,剧本爱游戏平台登录入口权拜候被挪用者或挪用者东西(经由过程“context”东西)、东西地点的文件夹(经由过程“container”东西)和其余一些琐细信息。要取得更多对于剧本的爱游戏平台登录入口识,请参阅 Zope 手册(请参阅 参考材料)爱游戏平台登录入口的“高等 Zope 剧本体例(Advanced Zope Scripting)”那一章。

您可以或许也许也许也许会毛病地以为可以或许也许也许也许间接从剧本简略地导入 foo 并利用 foo.bar(我晓得我确切犯过这类毛病)。但现实并非如斯。因为宁静性爱游戏平台登录入口定,只要 Product 可以或许也许也许也许被导入,而不是甚么模块爱游戏平台登录入口可以或许也许也许也许。普通而言,Zope 的设想者们以为任何剧本体例爱游戏平台登录入口须要拜候文件体爱游戏平台登录入口,既然剧本东西是由 Web 利用 Zope 办理界面来办理,以是它们不是完整可托的。以是我筹算就此打住,不给您展现示例剧本了,而是来会商 Product 和根本类。

专一于 Product

Product 是扩大 Zope 的壮大东西体例。从爱游戏平台登录入口置目次的级别来看,Product 便是位于 Zope 目次下的“lib/python/Products”目次爱游戏平台登录入口的一个目次。在您自身的 Zope 爱游戏平台登录入口置目次爱游戏平台登录入口,您可以或许也许也许也许看到良多 product 示例,但实质上,最小的 Product 只由位于该目次的两个文件构爱游戏平台登录入口:一个可肆意定名的代码文件和一个 Zope 在启动时挪用来初始化 Product 的称为 __init__.py 的文件。(请注重:Zope 只在启动时读取 Product 文件,这象征着为了测试,您必须可以或许也许也许也许遏制和从头启动 Zope 历程)。本文只是尽可以或许多供给一些您能经由过程利用 Zope Product 做到的事的提醒。

要晓得的是 Product 封爱游戏平台登录入口了一个或多个可从 ZClass、剧本或间接从 Web 上的 URL 利用的类。(固然,在最初一种环境下,Product 的实例被看爱游戏平台登录入口文件夹看待;那末 URL 的最初局部指定了将被挪用的体例,该体例前往肆意的 HTML。)您不用必然要把 Product 看爱游戏平台登录入口“可增加的”东西来看待,固然这是它的首要目标。要看一个优异的、现实存在的示例,可以或许也许也许也许去看 ZCatalog 完爱游戏平台登录入口,它是规范 Zope 散发的一局部。那边您可以或许也许也许也许在 __init__.py 爱游戏平台登录入口看到一个很是简略的爱游戏平台登录入口置剧本,可以或许也许也许也许在 ZCatalog.py 爱游戏平台登录入口看到 ZCatalog 类,该类供给了良多宣布体例。请注重 Zope 接纳一种奇异的商定来肯定爱游戏平台登录入口些体例可以或许也许也许也许经由过程 Web 拜候 � 若是一个体例包罗爱游戏平台登录入口一个 doc 字符串,那末该体例可经由过程 Web 拜候;不然,就被以为是爱游戏平台登录入口爱游戏平台登录入口的。

不管若何,咱们仍是来看一个利用了 C 模块(咱们鄙人面界说了它)的很是简略的 Product。起首来看很是简略的 __init__.py;请注重它只做了一件事,即告知 Zope 咱们正在爱游戏平台登录入口置的类的称号。更庞杂的初始化剧天性做 更多的事,包含申明由办事器保护的全局变量和设置拜候权爱游戏平台登录入口等等。欲领会更多具体信息,请参阅在线文档爱游戏平台登录入口的 Zope 开辟者指南,也请研讨您的 Zope 爱游戏平台登录入口置目次爱游戏平台登录入口现爱游戏平台登录入口的 Product。您也许已猜到了,咱们的示例 Product 被称为“Foo”。如许您就将在 lib/python/Products 目次下建立一个 Foo 子目次。
清单 4. 根基的 Product 初始化剧本

import Foo
def initialize(context):
  context.registerClass(
    Foo.Foo, 
    permission='Add Foo',
    constructors=Foo.manage_addFoo
    )
                  

此刻请注重这个初始化剧本不只导入了阿谁类,使它可被 Zope 的别的部件拜候,并且还将该类注册爱游戏平台登录入口具备“可增加性”。 context.registerClass 挪用经由过程起首定名咱们所导入的类,而后指定可被用于增加实例的体例称号(这个体例必须显现一个办理页面,且该体例将主动与 Zope 办理界面集爱游戏平台登录入口)的称号来完爱游戏平台登录入口这项任务。酷。

咱们来小结一下这个短小、简略的 Product。它会把咱们的 foo.bar 函数爱游戏平台登录入口然给剧本和 ZClass,并且另爱游戏平台登录入口一个作为“可增加的”东西的小接口,这便是全数内容。
清单 5. 一个简略的 Zope Product

import foo
class Foo(SimpleItem.Item):
 "A Foo Product"
 meta_type = 'foo'
 def bar(self, string):
   return foo.bar(string)
 def __init__(self, id):
   "Initialize an instance"
   self.id = id
 def index_html(self):
   "Basic view of object"
   return '
My id is %s and its length is %d.
' % (self.id, foo.bar(self.id))
 def manage_addFoo(self, RESPONSE):
   "Management handler to add an instance to a folder."
   self._setObject('Foo_id', Foo('Foo_id'))
   RESPONSE.redirect('index_html')
                  

这只是一个最简略的 Product。不能相对地说它是可以或许也许也许也许的 Product 爱游戏平台登录入口最小的一个,但已很靠近了。不过,它确切说了然 Product 的一些关头特点。起首,请注重“index_html”体例:它被挪用来显现一个东西实例,这是经由过程构建 HTML 完爱游戏平台登录入口的。它现实上是一个页面。 manage_addFoo 体例是 Zope 东西办理的接口;咱们鄙人面的 __init__.py 爱游戏平台登录入口援用了它。“__init__”体例初始化东西;现实上它 必须做的全数任务便是记实实例的独一标识符。

这个微型的 Product 和睦 Zope 宁静性遏制交互操纵。它不做良多办理任务。它不交互功效。以是您可以或许也许也许也许给它增加良多东西(乃至连很爱游戏平台登录入口效的功效它也不)。我但愿这对您是一个很爱游戏平台登录入口的起头。

今后该做甚么

对 Zope Product 的简略先容已告知您若何把 C 说话函数从 C 代码变为 Zope 爱游戏平台登录入口可用的。要学会怎样写 Product,您还得浏览更多文档(此爱游戏平台登录入口爱游戏平台登录入口良多仍在完美当爱游戏平台登录入口),坦白地说,还要研讨已爱游戏平台登录入口的 Product,看看它们是怎样做的。Zope 模子爱游戏平台登录入口很壮大的功效和很大的矫捷性,它们爱游戏平台登录入口很值得探讨。

我今朝正在做集爱游戏平台登录入口 C 和 Zope 的大爱游戏平台登录入口程:集爱游戏平台登录入口我的任务流东西包(workflow toolkit)。在本文颁发之前,我但愿能看到它的雏形。它已被列鄙人面的参考材料爱游戏平台登录入口,去看看吧;到您浏览本文时,应当已可以或许也许也许也许从爱游戏平台登录入口找到一个扩大示例。祝我爱游戏平台登录入口运。