如何在Python中执行Curl

我试图在python脚本中执行curl命令,无法通过符号传递密码。

import os; os.system("curl -H 'Content-Type: text/xml;charset=UTF-8' -u 'appuser:appuser!@3pass' -i -v 'http://app.com/webservice/getUserData' -o userdata.xml") 

我得到了拒绝访问的消息,用户名和密码都是正确的。 我想这是因为密码中的特殊字符。 我试图逃脱像appuser\!\@3pass但没有帮助。

任何人都可以通过此指导?

您正在使用的命令无法正常工作,因为单引号在Windows中没有特殊的含义,所以它们直接传递给了curl程序。 所以,如果你从Linux复制命令行(它会工作),这不会在这里工作(虚假的引号传递appuser!@3pass'例如登录/密码字段接收'appuserappuser!@3pass' ,也Content-Type: text/xml;charset=UTF-8完全不受保护,被理解为2个独立的参数)

从控制台进行简单的测试:

 K:\progs\cli>curl.exe -V curl 7.50.3 (x86_64-pc-win32) libcurl/7.50.3 OpenSSL/1.0.2h nghttp2/1.14.1 Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: AsynchDNS IPv6 Largefile NTLM SSL HTTP2 

(如果我用双引号使用"-V" ,也可以使用),但是如果我在版本arg上使用简单的引用,则会得到:

 K:\progs\cli>curl.exe '-V' curl: (6) Could not resolve host: '-V' 

正如o11c所评论的那样,有一个用于处理卷曲的python模块,你最好用它来处理。

对于其他情况,如果你不能这样做,使用os.system已经被弃用了。 使用subprocess.check_call例如更好(python 3.5有一个统一的run功能):

  • 检查返回代码,如果错误引发异常
  • 无需手动进行参数传递和引用的能力。

让我们来修复你的例子:

 subprocess.check_call(["curl","-H","Content-Type: text/xml;charset=UTF-8","-u",'appuser:appuser!@3pass',"-i","-v",'http://app.com/webservice/getUserData',"-o","userdata.xml"]) 

请注意,我特意混合了单双引号。 Python不关心。 如果参数中有空格, check_call机制会自动处理参数保护/引用。

当调用这个脚本时,我得到了像下面这样的userdata.xml

 HTTP/1.1 301 Moved Permanently Date: Fri, 15 Sep 2017 20:49:50 GMT server: Apache Location: http://www.app.com/webservice/getUserData Content-Type: text/html; charset=iso-8859-1 Transfer-Encoding: chunked <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>301 Moved Permanently</title> </head><body> <h1>Moved Permanently</h1> <p>The document has moved <a href="http://www.app.com/webservice/getUserData">here</a>.</p> </body></html>