无法从应用程序引擎中的FTP服务器下载csv文件

时间:2015-02-01 15:56:35

标签: python google-app-engine csv ftp

我试图从AppEngine中的ftp服务器读取CSV文件,并且我能够连接到ftp服务器。但是当我尝试检索文件时它返回了错误。 这是我从服务器读取CSV文件的代码:

import ftplib
import cStringIO
import csv

session = ftplib.FTP('myftpserver.com')
session.login('username','pwd')
session.set_pasv(False)

output = cStringIO.StringIO()

session.retrbinary('RETR myfile.csv', output.write)
csvfile = csv.reader(output.getvalue().splitlines(), delimiter=',')

for i, row in enumerate(csvfile):
    print row

这是我得到的错误的追溯:

  Traceback (most recent call last):
  File "/home/vikas/apps/myproj/django/core/handlers/base.py", line 111, in get_response
    response = callback(request, *callback_args, **callback_kwargs)
  File "/home/vikas/apps/myproj/admin/admin_actions.py", line 3528, in get_ftp_file
    session.retrbinary('RETR myfile.csv', output.write)
  File "/usr/lib/python2.7/ftplib.py", line 414, in retrbinary
    conn = self.transfercmd(cmd, rest)
  File "/usr/lib/python2.7/ftplib.py", line 376, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
  File "/usr/lib/python2.7/ftplib.py", line 354, in ntransfercmd
    sock = self.makeport()
  File "/usr/lib/python2.7/ftplib.py", line 283, in makeport
    for res in socket.getaddrinfo(None, 0, self.af, socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
  File "/home/vikas/gcloud/google-cloud-sdk/platform/google_appengine/google/appengine/api/remote_socket/_remote_socket.py", line 318, in getaddrinfo
    raise gaierror(EAI_NONAME, 'nodename nor servname provided, or not known')
gaierror: [Errno 8] nodename nor servname provided, or not known

我不知道我做错了什么,dir() nlst()等命令都没有工作,上面的错误一发生就发生了。

1 个答案:

答案 0 :(得分:2)

唉,App Engine目前提供的套接字仿真并不足以涵盖所有用例。

这是一个访问着名的公共匿名FTP服务器并从中获取一个小文本文件的示例,这样每个人都可以重现并试验......:在文件getit.py中,我们有:< / p>

import ftplib
import cStringIO

def getit():
    session = ftplib.FTP('ftp.mozilla.org')
    session.login('anonymous','')
    # session.set_pasv(False)
    session.cwd('/pub/mozilla.org')

    output = cStringIO.StringIO()
    session.retrbinary('RETR README', output.write)

    return output.getvalue()

if __name__ == '__main__':
    print(getit())

这样可以独立运行python getit.py,无论您是将set_pasv评论为此处,还是删除评论。

将其嵌入GAE应用程序中,例如:

import getit
class GetitPage(webapp2.RequestHandler):
  def get(self):  # pylint:disable-msg=invalid-name
     try: result = getit.getit()
     except Exception as e:
         result = 'Error {}: {}'.format(type(e), e)
     self.response.headers['Content-Type'] = 'text/plain'
     self.response.out.write(result)

这样可以正常使用set_pasv留言,但是如果您对它进行注释,则会得到与您收到的基本相同的异常。

因此,对服务器执行FTP以强制您进入活动模式(不支持被动模式)不会以这种方式工作。但是, 是一个相当破碎的服务器 - 您是否可以修复它以便它支持流行的默认被动模式?然后你的GAE应用程序可以愉快地工作......!