Python中的网络编程

时间:2010-01-24 18:51:42

标签: python sockets network-programming

我应该使用哪个库进行网络编程? sockets是最好的,还是有更高级别的界面,这是标准的?

我需要一些非常跨平台的东西(即Linux,Windows,Mac OS X),它只需要能够使用相同的库连接到其他Python程序。

8 个答案:

答案 0 :(得分:7)

你只想在节点之间发送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

扭曲在工业应用中很受欢迎,但它有一个残酷的学习曲线。

答案 1 :(得分:6)

您可能感兴趣的框架:Twisted

答案 2 :(得分:6)

答案取决于你想要做什么。

“我应该使用什么库进行网络编程?”很模糊。

例如,如果你想做HTTP,你可能会看到像urllib,urllib2,httplib,socket这样的标准库。这完全取决于您要使用的协议以及您希望使用的网络层。

python中有各种网络任务的库...电子邮件,网络,rpc等等......

对于初学者,查看标准库参考手册并查看您要执行的任务,然后从那里开始:http://docs.python.org/library/index.html

答案 3 :(得分:5)

如前所述,Twisted是最受欢迎的(到目前为止)。但是,还有很多其他值得探索的选择。 TornadoDiesel可能是排名前两位的竞争者。更完整的比较is found here

答案 4 :(得分:5)

就我个人而言,我只使用标准库中的asyncore,这有点像Twisted的一个非常简化的版本,但这是因为我更喜欢简单的低级接口。如果你想要一个更高级别的界面,特别是只是为了与你自己的程序的另一个实例进行通信,你不必担心网络层,可以考虑更高级别的内容,如RPyC或{{3}而是。然后,网络成为一个实现细节,您可以专注于发送信息。

答案 5 :(得分:4)

很多人喜欢Twisted。我有一段时间是一个巨大的粉丝,但是稍微考虑一下并且考虑更多,我已经变得不再幻想。这很复杂,最后我看了,很多都假设你的程序总是能够发送数据导致程序增长内存使用的可能情况,无休止地缓冲数据发送没有被遥控器拾取或者没有被足够快地拾起。

在我看来,这很大程度上取决于你想要做什么样的网络编程。很多时候,在等待IO时,你并不真正关心完成任务。例如,HTTP是面向请求 - 响应的,如果你只是在谈论单个服务器,就没有理由需要像Twisted和普通套接字这样的东西,或者Python的内置HTTP库可以正常工作。

如果您正在编写任何类型的服务器,您几乎肯定需要事件驱动。 Twisted在那里略有优势,但对我来说似乎仍然过于复杂。例如,Bittorrent是用Python编写的,根本不使用Twisted。

另一个支持Twisted的因素是已经为它编写了许多协议的代码。因此,如果您想说现有的协议,可能已经为您做了很多艰苦的工作。

答案 6 :(得分:1)

如果您不需要高性能,我认为标准库中的socket模块是个不错的选择。

这是一个非常着名的API,几乎每种语言的几乎每个开发人员都知道它。它非常简单,互联网上有很多信息。此外,其他人更容易理解您的代码。

我想像Twisted这样的事件驱动框架具有更好的性能,但在基本情况下标准套接字就足够了。

当然,如果你使用更高级别的协议(http,ftp ...),你应该在python标准库中使用相应的实现。

答案 7 :(得分:0)

Socket是低级api,它直接映射到操作系统接口。 Twisted,Tornado ......是高级框架(当然它们是基于套接字构建的,因为套接字是低级别的)。 谈到TCP / IP编程时,您应该掌握一些基本知识来决定使用什么:

  • 您是否会使用HTTP,FTP等知名协议或创建自己的协议?
  • 阻止还是非阻塞? Twisted,Tornado是非阻塞框架(基本上类似于nodejs)。 当然,socket可以做任何事情,因为每个其他框架都基于它;)