Pycurl介绍

article/2025/10/7 14:59:27

pycurl — A Python interface to the cURL library

Pycurl包是一个libcurl的Python接口.pycurl已经成功的在Python2.2到Python2.5版编译测试过了.

Libcurl是一个支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 和 LDAP的客户端URL传输库.libcurl也支持HTTPS认证,HTTP POST,HTTP PUT,FTP上传,代理,Cookies,基本身份验证,FTP文件断点继传,HTTP代理通道等等.

Libcurl提供的所有功能都可以通过pycurl接口来使用.

Module Functionality

pycurl.global_init(option) ->None
选项是以下常量之一:pycurl.GLOBAL_SSL, pycurl.GLOBAL_WIN32, pycurl.GLOBAL_ALL, pycurl.GLOBAL_NOTHING, pycurl.GLOBAL_DEFAULT. 相应的是libcurl的 curl_global_init() 方法.

pycurl.global_cleanup() -> None
相应的是libcurl的curl_global_cleanup()方法.

pycurl.version
这是liburl当前版本的信息,相应的是liburl的curl_version()方法.
用法举例:

>>> import pycurl
>>> pycurl.version
' libcurl/7.12.3 OpenSSL/0.9.7e zlib/1.2.2.1 libidn/0.5.12 '

pycurl.version_info() -> Tuple
相对应的是libcurl中的 curl_version_info() 方法. 返回一个序列信息就像liburl的curl_version_info()方法返回的 curl_version_info_data 结构化数据.
用法举例:

>>> import pycurl
>>> pycurl.version_info()
(
2 , ' 7.12.3 ' , 461827 , ' i586-pc-linux-gnu ' , 1565 , ' OpenSSL/0.9.7e ' , 9465951 ,
' 1.2.2.1 ' , ( ' ftp ' , ' gopher ' , ' telnet ' , ' dict ' , ' ldap ' , ' http ' , ' file ' ,
' https ' , ' ftps ' ), None, 0, ' 0.5.12 ' )

pycurl.Curl() -> Curl object
这个函数创建一个同libcurl中的CURL处理器相对应的Curl 对象.Curl对象自动的设置CURLOPT_VERBOSE为0, CURLOPT_NOPROGRESS为1,提供一个默认的CURLOPT_USERAGENT和设置CURLOPT_ERRORBUFFER指向一个私有的错误缓冲区.

pycurl.CurlMulti() -> CurlMulti object
这个函数创建一个新的与libcurl中的CURLM处理器相对应的CurlMulti对象.

pycurl.CurlShare() -> CurlShare object
这个函数创建一个新的与libcurl中的CURLSH处理器相对应的CurlShare对象.CurlShare对象可以在Curl对象上传递SHARE选项参数.

Subsections

  • Curl objects
  • CurlMulti objects
  • CurlShare objects
  • Callbacks

    Curl Object

    Curl对象具有以下方法:

    close() -> None
    对应的是libcurl中的curl_easy_cleanup方法.当Curl对象不再被引用时pycurl会自动调用这个方法,但也可直接地调用这个方法.

    perform() -> None
    对应于libcurl中的curl_easy_perform方法.

    setopt(option, value) -> None
    对应于libcurl中的curl_easy_setopt方法, option使用libcurl中的CURLOPT_*常量来指定,只可惜CURLOPT_前缀现在已经被去掉了.value的数据类型依赖于 option,它可以是一个字符串,整型,长整型,文件对象,列表或是函数.
    用法举例:

    import pycurl
    c
    = pycurl.Curl()
    c.setopt(pycurl.URL,
    " http://www.python.org/ " )
    c.setopt(pycurl.HTTPHEADER, [
    " Accept: " ])
    import StringIO
    b
    = StringIO.StringIO()
    c.setopt(pycurl.WRITEFUNCTION, b.write)
    c.setopt(pycurl.FOLLOWLOCATION,
    1 )
    c.setopt(pycurl.MAXREDIRS,
    5 )
    c.perform()
    print b.getvalue()

    getinfo(option) -> Result
    对应于libcurl中的curl_easy_getinfo方法, option同样使用libcurl中的CURLOPT_*常量来指定,只可惜CURLOPT_前缀现在已经被去掉了. Result包含一个整数,浮点数或字符串,这都信赖于给定的option.getinfo方法不能在perform方法未调用或完成之前进行调用.
    用法举例:

    errstr() -> String
    返回这个处理器中内部libcurl错误缓冲区的字符串表示.

    CurlMulti Object


    CurlMulti对象具有以下方法:

    close() -> None
    对应于libcurl中的curl_multi_cleanup()方法.当CurlMulti对象不再被引用时pycurl会自动调用该方法,也可显示调用该方法.

    perform() -> tuple of status and the number of active Curl objects
    对应于libcurl中的curl_multi_perform()方法.

    add_handle(Curl object) -> None
    对应于libcurl中的curl_multi_add_handle()方法.这个方法添加一个有效的Curl对象到CurlMulti对象.
    重要提示:add_handle没有隐式的增加对Curl对象的引用(因而也没有增加Curl对象的引用次数)

    remove_handle(Curl object) -> None
    对应于libcurl中的curl_multi_remove_handle()方法.这个方法从CurlMulti对象中移除一个现有的Curl对象.
    重要提示:remove_handle不会隐式的移除Curl对象的引用(因而不会减少Curl对象的引用次数).

    fdset() -> triple of lists with active file descriptors, readable, writeable, exceptions.
    对应于libcurl中的curl_multi_fdset()方法.这个方法从CurlMulti对象中提取文件描述信息.返回的列表可以被用于select模块to poll for events.
    用法举例:

    import pycurl
    c
    = pycurl.Curl()
    c.setopt(pycurl.URL,
    " http://curl.haxx.se " )
    m
    = pycurl.CurlMulti()
    m.add_handle(c)
    while 1 :
         ret, num_handles
    = m.perform()
        
    if ret != pycurl.E_CALL_MULTI_PERFORM: break
    while num_handles:
         apply(select.select, m.fdset()
    + ( 1 ,))
        
    while 1 :
             ret, num_handles
    = m.perform()
            
    if ret != pycurl.E_CALL_MULTI_PERFORM: break

    select(timeout) -> number of ready file descriptors or -1 on timeout
    这是一个有用的函数,它简化了fdest()和select模块的组合使用.
    用法举例:

    import pycurl
    c
    = pycurl.Curl()
    c.setopt(pycurl.URL,
    " http://curl.haxx.se " )
    m
    = pycurl.CurlMulti()
    m.add_handle(c)
    while 1 :
         ret, num_handles
    = m.perform()
        
    if ret != pycurl.E_CALL_MULTI_PERFORM: break
    while num_handles:
         ret
    = m.select( 1.0 )
        
    if ret == - 1 :   continue
        
    while 1 :
             ret, num_handles
    = m.perform()
            
    if ret != pycurl.E_CALL_MULTI_PERFORM: break

    info_read([max]) -> numberof queued messages, a list of successful objects, a list of failed objects
    对应于libcurl中的curl_multi_info_read()方法.这个方法从多重栈中提取至多max个信息然后返回两个列表.第一个列表包含成功完成的操作第二个列表包含每一个失败的curl对象的<curl对象,curl错误代码,curl错误信息>序列.

    CurlShare Object

    CurlShare对象具有以下方法:

    setopt(option, value) -> None
    对应于libcurl中的curl_share_setopt方法, option使用libcurl中的CURLOPT_*常量来指定,只可惜CURLOPT_前缀现在改成SH_了.通常value必须是 LOCK_DATA_COOKIE 或者说LOCK_DATA_DNS.
    用法举例:

    import pycurl
    curl
    = pycurl.Curl()
    s
    = pycurl.CurlShare()
    s.setopt(pycurl.SH_SHARE, pycurl.LOCK_DATA_COOKIE)
    s.setopt(pycurl.SH_SHARE, pycurl.LOCK_DATA_DNS)
    curl.setopt(pycurl.URL,
    ' http://curl.haxx.se ' )
    curl.setopt(pycurl.SHARE, s)
    curl.perform()
    curl.close()


    Callbacks

    为了更好的控制,libcurl允许把一些回调函数关联到每个连接中.在pycurl中,回调函数通过Curl对象调用setopt为s WRITEFUNCTION, READFUNCTION, HEADERFUNCTION, PROGRESSFUNCTION, IOCTLFUNCTION, 或DEBUGFUNCTION这些选项设置.这些选项对应着libcurl中CURLOPT_*前缀被移除的选项.在pycurl中回调函数必须是一个正规的Python函数,或者一个类的方法或是一个扩展的函数类型.

    这儿有些局限性就是这些选项的回调函数有可能同时发生.它允许不同的回调函数对应到不同的Curl对象.更多明确的是,WRITEDATA的回调函数不能用于WRITEFUNCTION,READDATA的回调函数不能用于READFUNCTION,WRITEHEADER的回调函数不能用于 HEADERFUNCTION,PROGRESSDATA回调函数不能用于PROGRESSFUNCTION,IOCTLDATA回调函数不能用于 IOCTLFUNCTION,DEBUGDATA回调函数不能用于DEBUGFUNCTION.实际上,可以通过把一个类的实例方法来当作回调函数并且使用类实例属性像文件对象那样存储每个对象的数据来克服这种局限性.

    Pycurl中的每个回调函数的签名如下:


    WRITEFUNCTION(string) -> number of characters written

    READFUNCTION(number of characters to read)-> string

    HEADERFUNCTION(string) -> number of characters written

    PROGRESSFUNCTION(download total, downloaded, upload total, uploaded) -> status

    DEBUGFUNCTION(debug message type, debug message string) -> None

    IOCTLFUNCTION(ioctl cmd) -> status

    Example: Callbacks for document header and body

    这个例子打印头数据到stderr打印内容数据到stdout.同样注意它们都不返回写入的字节数. WRITEFUNCTION和HEADERFUNCTION回调,写入所有字节时返回None.

         # # Callback function invoked when body data is ready
         def body(buf):
            
    # Print body data to stdout
             import sys
             sys.stdout.write(buf)
            
    # Returning None implies that all bytes were written

        
    # # Callback function invoked when header data is ready
         def header(buf):
            
    # Print header data to stderr
             import sys
             sys.stderr.write(buf)
            
    # Returning None implies that all bytes were written

         c
    = pycurl.Curl()
         c.setopt(pycurl.URL,
    " http://www.python.org/ " )
         c.setopt(pycurl.WRITEFUNCTION, body)
         c.setopt(pycurl.HEADERFUNCTION, header)
         c.perform()

    Example: Download/upload progress callback

    这个例子演示如何使用进度回调.当下载一个文档时,uploads参数都将是0,反之亦然.

         # # Callback function invoked when download/upload has progress
         def progress(download_t, download_d, upload_t, upload_d):
            
    print " Total to download " , download_t
            
    print " Total downloaded " , download_d
            
    print " Total to upload " , upload_t
            
    print " Total uploaded " , upload_d

         c.setopt(c.URL,
    " http://slashdot.org/ " )
         c.setopt(c.NOPROGRESS, 0)
         c.setopt(c.PROGRESSFUNCTION, progress)
         c.perform()

    Example: Debug callbacks

    这个例子演示如何使用调试回调.调试信息类型是一个调试信息的整数标示类型.在这个回调被调用时VERBOSE选项必须可用.

         def test(debug_type, debug_msg):
            
    print " debug(%d): %s " % (debug_type, debug_msg)

         c
    = pycurl.Curl()
         c.setopt(pycurl.URL,
    " http://curl.haxx.se/ " )
         c.setopt(pycurl.VERBOSE,
    1 )
         c.setopt(pycurl.DEBUGFUNCTION, test)
         c.perform()


    Other examples

    Pycrul也包含一些用于演示如何在libcurl中使用不同的回调的测试脚本和事例.例如,文件 examples/file_upload.py包含如何使用READFUNCTION的事例代码, 'tests/test_cb.py'演示WRITEFUNCTION和HEADERFUNCTION, 'tests/test_debug.py'演示DEBUGFUNCTION, 'tests/test_getinfo.py'演示PROGRESSFUNCTION.

    ============================================================================

    编辑文本保存在C:/Python25/Lib下的pycurl_test.py

    import pycurl
    import StringI

    def getURLContent_pycurl(url):  
       c = pycurl.Curl()
       c.setopt(pycurl.URL,url)
       b = StringIO.StringIO()
       c.setopt(pycurl.WRITEFUNCTION, b.write)
       c.setopt(pycurl.FOLLOWLOCATION, 1)
       c.setopt(pycurl.MAXREDIRS, 5)
       #c.setopt(pycurl.PROXY, 'http://11.11.11.11:8080')
       #c.setopt(pycurl.PROXYUSERPWD, 'aaa:aaa')
       c.perform()
       return b.getvalue()

    在命令行中输入import pycurl_test

    url ='http://blog.csdn.net'

    content = getURLContent_pycurl(url)

    print content

    =============================================================

     


http://chatgpt.dhexx.cn/article/pk06r6bi.shtml

相关文章

[windows]python 安装pycurl

问题描述 pip install pycurl 报错 手动安装 下载地址&#xff1a;https://www.lfd.uci.edu/~gohlke/pythonlibs/ 页面搜索&#xff1a; pycurl 下载对应版本的whl文件&#xff0c;我是windows环境 python3.8 所以下载pycurl-7.45.1-cp38-cp38-win32.whl 安装&#xff1a;…

Python实用模块之pycurl

软硬件环境 ubuntu 19.04 64bitanaconda3 with python 3.7.3pycurl 7.43.0.2 简介 CURL是一个基于URL进行数据传输的命令行工具&#xff0c;使用C语言编写&#xff0c;支持http&#xff0c;https&#xff0c;ftp&#xff0c;telnet&#xff0c;file&#xff0c;ldap等常见网络传…

ipcs -a

消息队列、共享内存、信号量

ipcc

IPCCX装完后连接不了LDAP,怎么解决&#xff1f;&#xff1f; 装完了IPCCX, 靠&#xff0c; 直接给我来歌60秒关机&#xff0c; 后面还有LDAP连接问题&#xff0c; 我的IPCCX server 可以ping通ccm server, 为什么LDAP会挂呢&#xff1f;&#xff1f;&#xff1f; 请问我现在要怎…

ipcs报错:kernel not configured for shared memory、semaphore、message queues [解决方法]

前言 今天在复习linux进程间通信的shared memory 共享内存时&#xff0c;在PC端的VMare Workstation虚拟机的Ubuntu上测试我写的shared_memory_CREAT.c 和shared_memory_CONSUME.c 时正常在PC端运行&#xff0c;就想着把程序用交叉编译器编译成arm格式放到linux开发板上运行试…

ipcs

&#xfeff;&#xfeff; linux命令-ipcs 格式&#xff1a;ipcs [-asmq] [-tclup] ipcs [-smq] -i id ipcs -h 功能描述&#xff1a;ipcs命令用来显示系统存在的ipc&#xff08;进程间通信&#xff09;相关信息。 参数&#xff1a;-i 显示指定id的ip…

IPC方案

近期了解了不少网络摄像头相关知识&#xff0c;主要功能组成如下&#xff1a; WIFI&#xff0c;USB接口或者SDIO接口实现 RJ45 本地TF存储 IR CUT&#xff0c;滤光片切换 移动侦测&#xff0c;人体感应 夜视功能&#xff0c;依靠红外灯 云台控制&#xff0c;PWM控制Moto&#…

Linux15 --- 信号量、ipcs

1、IPC机制&#xff1a; 进程间通信&#xff08;管道、信号量、共享内存、消息队列、套接字&#xff09; 2、信号量&#xff1a; 可以类比于红绿灯&#xff0c;对于路口这个共享的通行权&#xff0c;谁得到红绿灯的通行信号&#xff0c;才可以得到路口的通行权&#xff0c;没…

Linux ipcs命令与ipcrm命令的用法详解

转载地址&#xff1a;http://www.jb51.net/article/40805.htm linux/uinx上提供关于一些进程间通信方式的信息&#xff0c;包括共享内存&#xff0c;消息队列&#xff0c;信号 ipcs用法 ipcs -a 是默认的输出信息 打印出当前系统中所有的进程间通信方式的信息 ipcs -m 打印出…

ipcs命令详解——共享内存、消息队列、信号量定位利器

多进程间通信常用的技术手段包括共享内存、消息队列、信号量等等&#xff0c;Linux系统下自带的ipcs命令是一个极好的工具&#xff0c;可以帮助我们查看当前系统下以上三项的使用情况&#xff0c;从而利于定位多进程通信中出现的通信问题。目前也有一些帖子介绍ipcs命令的使用方…

(1)IPC简介

Unix/Linux IPC简介 简述1. 消息传递演变过程2. 同步形式演变 进程、线程与信息共享IPC对象的持续性名字空间fork、exec和exit对IPC对象的影响总结参考资料 简述 IPC是进程间通信(interprocess communication)的简称。用来描述运行在一个操作系统之上的不同进程间各种消息传递…

Linux——信号量(定义、示例、信号量接口、ipcs命令)

目录 1、信号量 2、信号量举例 3、信号量的接口 4、通过控制进程来完成打印机操作 5、ipcs命令 1、信号量 &#xff08;1&#xff09;定义:​​​​​​ ​信号量是一个特殊的变量&#xff0c;一般取正数值。它的值代表允许访问的资源数目&#xff0c;获取资源时&#xff…

什么是IPC?

目录 IPC的简介&#xff1a; IPC的主要功能模块&#xff1a; IPC信号处理过程&#xff1a; IPC硬件构成&#xff1a; IPC的简介&#xff1a; IPC&#xff1a;是IP Camera的简称。它是在前一代模拟摄像机的基础上&#xff0c;集成了编码模块后的摄像机。它和模拟摄像机的区别…

IPC是什么?

IPC是什么&#xff1f; ipc是IP Camera的缩写词&#xff0c;IP是网际协议&#xff0c;Camera是照相机、摄影机&#xff0c;IP Camera顾名思义就是网络摄像机&#xff0c;它是一种由传统摄像机与网络技术结合所产生的新一代摄像机。 网络摄像机又叫IP CAMERA&#xff08;简称IP…

linux ipcs命令详解

进程间通信概述 进程间通信有如下的目的&#xff1a;1、数据传输&#xff0c;一个进程需要将它的数据发送给另一个进程&#xff0c;发送的数据量在一个字节到几M之间&#xff1b;2、共享数据&#xff0c;多个进程想要操作共享数据&#xff0c;一个进程对数据的修改&#xff0c…

ipcs 命令

在unix/linux下&#xff0c;查看共享内存、信号量&#xff0c;队列等共享信息 相应的命令是ipcs [-m|-s|-q] -m列出共享内存&#xff0c;-s列出共享信号量&#xff0c;-q列出共享队列 清除命令是 ipcrm [-m|-s|-q] $id -m 删除共享内存&#xff0c;-s删除共享信号量&#xff0…

Linux的IPC命令

进程间通信概述 进程间通信有如下的目的&#xff1a;1、数据传输&#xff0c;一个进程需要将它的数据发送给另一个进程&#xff0c;发送的数据量在一个字节到几M之间&#xff1b;2、共享数据&#xff0c;多个进程想要操作共享数据&#xff0c;一个进程对数据的修改&#xff0c;…

Linux--ipcs、共享内存、共享接口简介

1.ipcs命令 ipcs -s: 只查看信号量 ; ipcs -m: 只查看共享内存 ; ipcs -q: 只查看消息队列 ; 删除信号量 : ipcrm -s 编号 ; 2.共享内存 共享内存为多个进程之间共享和传递数据提供了一种有效的方式。共享内存是先在物 理内存上申请一块空间&#xff0c;多个进程可以将其…

Linux系统中ipcs命令的使用

ipcs命令的学习 多进程间通信常用的技术手段包括共享内存、消息队列、信号量等等。 ipcs 命令的用途主要用于报告进程间通信设施状态。 ①查看帮助&#xff1a; ipcs -help ②查看所有资源&#xff08;设施&#xff09;&#xff1a; ipcs -a 或 ipcs ③三类资源单独查看方式 …

C++的access()函数

文章目录 函数功能头文件函数原型参数说明示例access函数详解 函数功能 确定文件是否存在或者判断读写执行权限&#xff1b;确定文件夹是否存在即&#xff0c;检查某个文件的存取方式&#xff0c;比如说是只读方式、只写方式等。如果指定的存取方式有效&#xff0c;则函数返回…