2015-02-01 3 views
1

AppEngine의 FTP 서버에서 CSV 파일을 읽으려는 중이므로 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() 등의 명령이 작동하고 있으며 추가 한 즉시 위의 오류가 발생했습니다.

+0

http://stackoverflow.com/questions/2693412/does-google-app-engine-support-ftp –

답변

2

아아, 현재 App Engine에서 제공하는 소켓 시뮬레이션은 이 아니며 모든 사용 사례를 다룰 수있는 상당히입니다. 여기

은 샘플이 ... 그냥 그렇게 모두 재현 실험을 할 수 있습니다, 잘 알려진 공공 익명 FTP 서버에 액세스하고 그것에서 작은 텍스트 파일을 가져 오는 것 : 파일 getit.py, 우리는이 :

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()) 

여기서는 set_pasv을 댓글로 남겨 두든, 주석을 제거하든, 독립 실행 형으로는 python getit.py으로 잘 실행됩니다.

는 예컨대하는 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 앱이 행복하게 작동 할 수 있습니다 ...!

관련 문제