【发布时间】:2014-01-21 05:51:28
【问题描述】:
我目前正在使用 Freeswitch 及其 event socket library(通过 mod event socket)。例如:
from ESL import ESLconnection
cmd = 'uuid_kill %s' % active_call # active_call comes from a Django db and is unicode
con = ESLconnection(config.HOST, config.PORT, config.PWD)
if con.connected():
e = con.api(str(cmd))
else:
logging.error('Couldn\'t connect to Freeswitch Mod Event Socket')
如您所见,我必须将con.api() 的参数显式转换为str()。没有它,调用将在以下堆栈跟踪中结束:
Traceback (most recent call last):
[...]
e = con.api(cmd)
File "/usr/lib64/python2.7/site-packages/ESL.py", line 87, in api
def api(*args): return apply(_ESL.ESLconnection_api, args)
TypeError: in method 'ESLconnection_api', argument 2 of type 'char const *'
我不明白这个 TypeError:这是什么意思? cmd 包含一个字符串,那么当我使用 str(cmd) 投射它时它会解决什么问题呢?
会不会是通过SWIG生成的Freeswitch的python API?
【问题讨论】:
-
active_call的类型是什么?如果是 unicode,那么cmd将是 Unicode 字符串,str(cmd)会将其转换为字符串。您可以在con.api调用之前插入import pdb; pdb.set_trace()行,然后检查cmd。 -
active_call很可能是 unicode,确实(来自 Django 数据库),但此错误消息中没有任何内容让我想到 unicode:你认为它可能相关吗? -
这肯定是相关的:API 很可能是通过一个只知道如何将 Python 字符串对象转换为
char const *的接口构建框架导出的(通过在对象上调用PyString_AsString)。 Python 2 Unicode 字符串不包含 C 字符——它们由wchar_t组成,这意味着它们不能简单地“转换”为const char *,它们需要转换为必须分配的新缓冲区,等等。在 Python 中将 Unicode 字符串预转换为字符串,在对象到达 C 之前执行最困难的部分。 -
Mhmmm,这与 FS 的一些 python 文件一致,提到 SWIG (swig.org),它将自己描述为 一个连接的软件开发工具用各种高级编程语言用 C 和 C++ 编写的程序。还有一些我不知道的事情,比如
char const *、C char或wchar_t,但我认为您的评论绝对值得回答。如果您有心情,请随时提供更多技术细节;)(另外我会在我的问题中添加细节) -
我不知道您不了解 C 基础知识。 :) 我现在添加了一个答案,详细解释了这一点。
标签: python freeswitch