① python twisted 写tcp 客户端 服务器 为什么self.transport.write传送多数据的时候,接受到是一起接受呢
因为tcp socket只是传送一个段连续的数据流,如果你write:
self.transport.write('Z')
self.transport.write('Z')
self.transport.write('Z')
因为三个write是连续的,所以对socket来说,它要传的就是用hex表示的'5a 5a 5a'这样一段数据,你分开写或者一次写对socket来说没有什么区别。
tcp socket的另一端需要接受多次的,要么是你要传送的数据太大,一个packet装不下,要么就是两次传送之间的时间有间隔,会形成两个packet。
一般的处理是你需要另外的一个Application Layer的protocol,比如最简单的你用 来分隔每一个write,然后在接收到的时候可以在数据里找到 ,然后就可以分别处理每一个write了。
② python-twisted模块有什么作用
这是一篇关于python之twisted模块安装的文章,文中有关python,twisted,安装的内容,请参考。
③ python3.5可以安装Twisted吗
在windows环境,python3.5下使用命令行安装模块
pip install Twisted
会报错
Unable to find vcvarsall.bat
原因大概是和VC编译环境有关系,网上找了一堆方法,感觉编译环境这事太麻烦。找到最简单是方法是,先安装
wheel模块,然后下载Twisted模块的.whl安装包,安装之
随便找一个.whl安装包下载,安装,又会碰到一些坑:
提示pip需要升级,根据它给的建议升级
提示[filename.whl is not supported wheel on this platform]
Twisted, an event-driven networking engine.
Twisted‑16.6.0‑cp27‑cp27m‑win32.whl
Twisted‑16.6.0‑cp27‑cp27m‑win_amd64.whl
Twisted‑16.6.0‑cp34‑cp34m‑win32.whl
Twisted‑16.6.0‑cp34‑cp34m‑win_amd64.whl
Twisted‑16.6.0‑cp35‑cp35m‑win32.whl
Twisted‑16.6.0‑cp35‑cp35m‑win_amd64.whl
Twisted‑16.6.0‑cp36‑cp36m‑win32.whl
Twisted‑16.6.0‑cp36‑cp36m‑win_amd64.whl
cp后面跟的数字是python的版本,比如现在我的python版本是3.5,那么需要下载cp35;
如果还提示不支持platform,就把win32和win64的版本都下下来分别试一下,我的系统是64位但是装32位的whl才能成功
④ python3.7无法导入twisted模块
>>>importtwisted
>>>fromtwistedimportinternet
>>>fromtwisted.internetimportreactor
我准备都正常,你重新试一遍
或者 重新 安装
⑤ python安装twisted,可是一直安装wheel她却显示不在一个平台,网上说是文件名不和要求
对的,没有在一个平台
⑥ Python编程网页爬虫工具集介绍
【导语】对于一个软件工程开发项目来说,一定是从获取数据开始的。不管文本怎么处理,机器学习和数据发掘,都需求数据,除了通过一些途径购买或许下载的专业数据外,常常需求咱们自己着手爬数据,爬虫就显得格外重要,那么Python编程网页爬虫东西集有哪些呢?下面就来给大家一一介绍一下。
1、 Beautiful Soup
客观的说,Beautifu Soup不完满是一套爬虫东西,需求协作urllib运用,而是一套HTML / XML数据分析,清洗和获取东西。
2、Scrapy
Scrapy相Scrapy, a fast high-level screen scraping and web crawling framework
for
Python.信不少同学都有耳闻,课程图谱中的许多课程都是依托Scrapy抓去的,这方面的介绍文章有许多,引荐大牛pluskid早年的一篇文章:《Scrapy
轻松定制网络爬虫》,历久弥新。
3、 Python-Goose
Goose最早是用Java写得,后来用Scala重写,是一个Scala项目。Python-Goose用Python重写,依靠了Beautiful
Soup。给定一个文章的URL, 获取文章的标题和内容很便利,用起来非常nice。
以上就是Python编程网页爬虫工具集介绍,希望对于进行Python编程的大家能有所帮助,当然Python编程学习不止需要进行工具学习,还有很多的编程知识,也需要好好学起来哦,加油!
⑦ python异步有哪些方式
yield相当于return,他将相应的值返回给调用next()或者send()的调用者,从而交出了CPU使用权,而当调用者再次调用next()或者send()的时候,又会返回到yield中断的地方,如果send有参数,还会将参数返回给yield赋值的变量,如果没有就和next()一样赋值为None。但是这里会遇到一个问题,就是嵌套使用generator时外层的generator需要写大量代码,看如下示例:
注意以下代码均在Python3.6上运行调试
#!/usr/bin/env python# encoding:utf-8def inner_generator():
i = 0
while True:
i = yield i if i > 10: raise StopIterationdef outer_generator():
print("do something before yield")
from_inner = 0
from_outer = 1
g = inner_generator()
g.send(None) while 1: try:
from_inner = g.send(from_outer)
from_outer = yield from_inner except StopIteration: breakdef main():
g = outer_generator()
g.send(None)
i = 0
while 1: try:
i = g.send(i + 1)
print(i) except StopIteration: breakif __name__ == '__main__':
main()041
为了简化,在Python3.3中引入了yield from
yield from
使用yield from有两个好处,
1、可以将main中send的参数一直返回给最里层的generator,
2、同时我们也不需要再使用while循环和send (), next()来进行迭代。
我们可以将上边的代码修改如下:
def inner_generator():
i = 0
while True:
i = yield i if i > 10: raise StopIterationdef outer_generator():
print("do something before coroutine start") yield from inner_generator()def main():
g = outer_generator()
g.send(None)
i = 0
while 1: try:
i = g.send(i + 1)
print(i) except StopIteration: breakif __name__ == '__main__':
main()
执行结果如下:
do something before coroutine start123456789101234567891011
这里inner_generator()中执行的代码片段我们实际就可以认为是协程,所以总的来说逻辑图如下:
我们都知道Python由于GIL(Global Interpreter Lock)原因,其线程效率并不高,并且在*nix系统中,创建线程的开销并不比进程小,因此在并发操作时,多线程的效率还是受到了很大制约的。所以后来人们发现通过yield来中断代码片段的执行,同时交出了cpu的使用权,于是协程的概念产生了。在Python3.4正式引入了协程的概念,代码示例如下:
import asyncio# Borrowed from http://curio.readthedocs.org/en/latest/[email protected] countdown(number, n):
while n > 0:
print('T-minus', n, '({})'.format(number)) yield from asyncio.sleep(1)
n -= 1loop = asyncio.get_event_loop()
tasks = [
asyncio.ensure_future(countdown("A", 2)),
asyncio.ensure_future(countdown("B", 3))]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()12345678910111213141516
示例显示了在Python3.4引入两个重要概念协程和事件循环,
通过修饰符@asyncio.coroutine定义了一个协程,而通过event loop来执行tasks中所有的协程任务。之后在Python3.5引入了新的async & await语法,从而有了原生协程的概念。
async & await
在Python3.5中,引入了aync&await 语法结构,通过”aync def”可以定义一个协程代码片段,作用类似于Python3.4中的@asyncio.coroutine修饰符,而await则相当于”yield from”。
先来看一段代码,这个是我刚开始使用async&await语法时,写的一段小程序。
#!/usr/bin/env python# encoding:utf-8import asyncioimport requestsimport time
async def wait_download(url):
response = await requets.get(url)
print("get {} response complete.".format(url))
async def main():
start = time.time()
await asyncio.wait([
wait_download("http://www.163.com"),
wait_download("http://www.mi.com"),
wait_download("http://www.google.com")])
end = time.time()
print("Complete in {} seconds".format(end - start))
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
这里会收到这样的报错:
Task exception was never retrieved
future: <Task finished coro=<wait_download() done, defined at asynctest.py:9> exception=TypeError("object Response can't be used in 'await' expression",)>
Traceback (most recent call last):
File "asynctest.py", line 10, in wait_download
data = await requests.get(url)
TypeError: object Response can't be used in 'await' expression123456
这是由于requests.get()函数返回的Response对象不能用于await表达式,可是如果不能用于await,还怎么样来实现异步呢?
原来Python的await表达式是类似于”yield from”的东西,但是await会去做参数检查,它要求await表达式中的对象必须是awaitable的,那啥是awaitable呢? awaitable对象必须满足如下条件中其中之一:
1、A native coroutine object returned from a native coroutine function .
原生协程对象
2、A generator-based coroutine object returned from a function decorated with types.coroutine() .
types.coroutine()修饰的基于生成器的协程对象,注意不是Python3.4中asyncio.coroutine
3、An object with an await method returning an iterator.
实现了await method,并在其中返回了iterator的对象
根据这些条件定义,我们可以修改代码如下:
#!/usr/bin/env python# encoding:utf-8import asyncioimport requestsimport time
async def download(url): # 通过async def定义的函数是原生的协程对象
response = requests.get(url)
print(response.text)
async def wait_download(url):
await download(url) # 这里download(url)就是一个原生的协程对象
print("get {} data complete.".format(url))
async def main():
start = time.time()
await asyncio.wait([
wait_download("http://www.163.com"),
wait_download("http://www.mi.com"),
wait_download("http://www.google.com")])
end = time.time()
print("Complete in {} seconds".format(end - start))
loop = asyncio.get_event_loop()
loop.run_until_complete(main())27282930
好了现在一个真正的实现了异步编程的小程序终于诞生了。
而目前更牛逼的异步是使用uvloop或者pyuv,这两个最新的Python库都是libuv实现的,可以提供更加高效的event loop。
uvloop和pyuv
pyuv实现了Python2.x和3.x,但是该项目在github上已经许久没有更新了,不知道是否还有人在维护。
uvloop只实现了3.x, 但是该项目在github上始终活跃。
它们的使用也非常简单,以uvloop为例,只需要添加以下代码就可以了
import asyncioimport uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())123
⑧ 为什么只能用 Python 只能用 2.7.x 而不能用 3.x 的呢
库不支持
主要原因是Twisted还不完全支持Python3. 虽然Twisted大部分是可移植到python3的,但Twisted的http agent并不支持Python3.
scrapy团队两年前就开始了向python3的移植工作。现在scrapy每次提交都有一部分测试在python3下执行。
⑨ python3.6 安装Twisted出错怎么办
卸载重新安装
安装教程1、选择install for all users 路点Nextpython 2.7.11默认安装至C盘
2、特别要注意选pipAdd python.exe to Path
3、打命令提示符窗口敲入python现两种情况:
⑴情况:
说明安装完毕
⑵情况二:错误:
①‘python’内部或外部命令运行程序或批处理文件
②Windows根据Path环境变量设定路径查找python.exe没找报错安装漏掉勾选Add python.exe to Path要手python.exe所路径C:\Python27添加Path
③知道修改环境变量建议Python安装程序重新运行遍记勾Add python.exe to Path