Python中的网络编程
Posted
技术标签:
【中文标题】Python中的网络编程【英文标题】:Network programming in Python 【发布时间】:2010-01-24 18:51:42 【问题描述】:我应该使用什么库进行网络编程? sockets
是最好的,还是有更高级别的接口,即标准?
我需要一些非常跨平台的东西(即 Linux、Windows、Mac OS X),并且它只需要能够使用相同的库连接到其他 Python 程序。
【问题讨论】:
【参考方案1】:您只想在节点之间发送 python 数据(可能在不同的计算机上)?您可能想查看 SimpleXMLRPCServer。它基于内置的 HTTP 服务器,它基于内置的 Socket 服务器,这两种服务器都不是周围最强大的服务器,但很容易快速设置:
from SimpleXMLRPCServer import SimpleXMLRPCServer
server = SimpleXMLRPCServer(("localhost", 9876))
def my_func(a,b):
return a + b
server.register_function(my_func)
server.serve_forever()
并且易于连接:
import xmlrpclib
s = xmlrpclib.ServerProxy('http://localhost:9876')
print s.my_func(2,3)
>>> 5
print type(s.my_func(2,3))
>>> <type 'int'>
print s.my_func(2,3.0):
>>> 7.0
Twisted 在工业应用中很受欢迎,但它的学习曲线很残酷。
【讨论】:
+1 作为另一个意识到 OP 不一定想要网络,只需要通信的人。【参考方案2】:有一个你可能感兴趣的框架:Twisted
【讨论】:
【参考方案3】:答案取决于你想要做什么。
“我应该使用什么库来进行网络编程?”很模糊。
例如,如果您想做 HTTP,您可能会查看 urllib、urllib2、httplib、sockets 等标准库。这完全取决于您要使用的协议,以及您希望在哪个网络层工作。
python 中有用于各种网络任务的库...电子邮件、网络、rpc 等...
对于初学者,请查看标准库参考手册并查看您想要执行哪些任务,然后从那里开始:http://docs.python.org/library/index.html
【讨论】:
【参考方案4】:如前所述,Twisted 是最受欢迎的(到目前为止)。然而,还有很多其他的选择值得探索。 Tornado 和 Diesel 可能是前两个竞争者。比较完整的比较is found here。
【讨论】:
如果您添加指向 Twised 的链接,我认为您的回答比 Jeramy 的要好。【参考方案5】:我个人只是使用标准库中的 asyncore,这有点像 Twisted 的精简版,但这是因为我更喜欢简单和低级的接口。如果您想要更高级别的接口,尤其是与您自己程序的另一个实例通信,您不必担心网络层,可以考虑使用更高级别的东西,例如RPyC 或pyro。然后,网络成为一个实现细节,您可以专注于发送信息。
【讨论】:
【参考方案6】:很多人都喜欢Twisted。有一段时间我是一个超级粉丝,但在使用它并更多地思考它时,我变得不再抱有幻想。这很复杂,最后我看了一下,其中很多都假设您的程序将总是能够发送数据,从而导致您的程序可能会不断增加内存使用量来缓冲要发送的数据'没有被远端接听或接听速度不够快。
在我看来,这很大程度上取决于你想做什么样的网络编程。很多时候,您在等待 IO 时并不真正关心完成工作。例如,HTTP 非常面向请求-响应,如果您只与单个服务器通信,则几乎没有理由需要 Twisted 和普通套接字或 Python 的内置 HTTP 库之类的东西。
如果您正在编写任何类型的服务器,您几乎肯定需要事件驱动。 Twisted 在那里有一点优势,但对我来说仍然过于复杂。例如,Bittorrent 是用 Python 编写的,根本不使用 Twisted。
另一个有利于 Twisted 的因素是已经为它编写了许多协议的代码。因此,如果您想使用现有协议,可能已经为您完成了很多艰苦的工作。
【讨论】:
【参考方案7】:如果您不需要高性能,我认为标准库中的socket
模块是一个不错的选择。
这是一个非常著名的 API,几乎所有语言的开发人员都知道它。这很简单,互联网上有很多可用的信息。此外,其他人会更容易理解您的代码。
我猜想像 Twisted 这样的事件驱动框架具有更好的性能,但在基本情况下,标准套接字就足够了。
当然,如果你使用更高级的协议(http、ftp...),你应该使用python标准库中相应的实现。
【讨论】:
【参考方案8】:Socket是底层api,直接映射到操作系统接口。 Twisted, Tornado ... 是高级框架(当然它们是建立在套接字上的,因为套接字是低级的)。 谈到 TCP/IP 编程,您应该具备一些基本知识来决定您应该使用什么:
您会使用 HTTP、FTP 等知名协议还是创建自己的协议? 阻塞还是非阻塞? Twisted、Tornado 都是非阻塞框架(基本类似于 nodejs)。 当然,socket 可以做任何事情,因为所有其他框架都是基于它的;)【讨论】:
以上是关于Python中的网络编程的主要内容,如果未能解决你的问题,请参考以下文章