Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 运行FTP.retrbinary检索文件时出错_Python_Ftp_Ftplib - Fatal编程技术网

Python 运行FTP.retrbinary检索文件时出错

Python 运行FTP.retrbinary检索文件时出错,python,ftp,ftplib,Python,Ftp,Ftplib,我正在使用pythons ftplib尝试从远程服务器检索文件(实践项目)。我发送文件没有问题,但在尝试检索时出错。我正在使用python 3。这是我的代码: from ftplib import FTP user = 'myusername' passw = 'mypassw' url = input('FTP url: ').lower().strip() ftp = FTP(url) #connect to the host, default port ftp.login(us

我正在使用pythons ftplib尝试从远程服务器检索文件(实践项目)。我发送文件没有问题,但在尝试检索时出错。我正在使用python 3。这是我的代码:

from ftplib import FTP

user = 'myusername'
passw = 'mypassw'
url = input('FTP url: ').lower().strip()
ftp = FTP(url)      #connect to the host, default port
ftp.login(user, passw) # enters login info

def getfile():
    ftp.retrlines('LIST')   # List directory contents
    filename = input('Name of file: ')
    localfile = open(filename, 'wb')
    ftp.retrbinary('RETR' + filename, localfile.write, 1024)
    localfile.close()

getfile()
这是我得到的错误:

Traceback (most recent call last):
  File "C:\Users\User\Desktop\School\python\ftpget.py", line 16, in <module>
    getfile()
  File "C:\Users\User\Desktop\School\python\ftpget.py", line 13, in getfile
    ftp.retrbinary('RETR' + filename, localfile.write, 1024)
  File "C:\Python34\lib\ftplib.py", line 441, in retrbinary
    with self.transfercmd(cmd, rest) as conn:
  File "C:\Python34\lib\ftplib.py", line 398, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
  File "C:\Python34\lib\ftplib.py", line 364, in ntransfercmd
    resp = self.sendcmd(cmd)
  File "C:\Python34\lib\ftplib.py", line 272, in sendcmd
    return self.getresp()
  File "C:\Python34\lib\ftplib.py", line 245, in getresp
    raise error_perm(resp)
ftplib.error_perm: 500 ?
回溯(最近一次呼叫最后一次):
文件“C:\Users\User\Desktop\School\python\ftpget.py”,第16行,在
getfile()
文件“C:\Users\User\Desktop\School\python\ftpget.py”,第13行,在getfile中
ftp.retrbinary('RETR'+文件名,localfile.write,1024)
文件“C:\Python34\lib\ftplib.py”,第441行,在retrbinary中
使用self.transfercmd(cmd,rest)作为连接:
文件“C:\Python34\lib\ftplib.py”,第398行,在transfercmd中
返回self.ntransfercmd(cmd,rest)[0]
文件“C:\Python34\lib\ftplib.py”,第364行,在ntransfercmd中
resp=self.sendcmd(cmd)
文件“C:\Python34\lib\ftplib.py”,第272行,在sendcmd中
返回self.getresp()
文件“C:\Python34\lib\ftplib.py”,第245行,在getresp中
升起错误\u perm(resp)
ftplib.error\u perm:500?

知道是什么导致了错误吗?

ftplib
如果响应的状态代码以“5”开头,则会引发错误。这意味着服务器返回5xx错误:

0.5.1500内部服务器错误

服务器遇到意外情况,无法正常运行 满足要求

  Note: Note to implementors: some deployed proxies are known to
  return 400 or 500 when DNS lookups time out.
10.5.2501未实施

服务器不支持实现所需的功能 要求当服务器没有响应时,这是适当的响应 识别请求方法,但无法为其提供支持 任何资源

10.5.3502坏网关

服务器在充当网关或代理时接收到无效的 来自它在尝试实现时访问的上游服务器的响应 请求

  Note: Note to implementors: some deployed proxies are known to
  return 400 or 500 when DNS lookups time out.
10.5.4503服务不可用

由于发生错误,服务器当前无法处理该请求 服务器的临时过载或维护。这意味着 这是一种暂时的情况,经过一段时间后会得到缓解 延迟如果已知,延迟的长度可以用 在标头之后重试。如果没有在之后重试,客户端应该 像处理500响应一样处理响应

  Note: The existence of the 503 status code does not imply that a
  server must use it when becoming overloaded. Some servers may wish
  to simply refuse the connection.
10.5.5网关超时

服务器在充当网关或代理时,未收到 URI指定的上游服务器的及时响应(例如。 HTTP、FTP、LDAP)或它需要的其他辅助服务器(如DNS) 在尝试完成请求时访问

  Note: Note to implementors: some deployed proxies are known to
  return 400 or 500 when DNS lookups time out.
10.5.6不支持HTTP版本

服务器不支持或拒绝支持HTTP协议 请求消息中使用的版本。服务器正在指示 无法或不愿意使用相同的方法完成请求 作为客户的主要版本,如第3.1节所述,不包括 显示此错误消息。响应应该包含一个实体 描述不支持该版本的原因以及其他哪些协议 由该服务器支持

根据报告:

FTP.retrbinary(命令,回调[,maxblocksize[,rest]])
取回 文件以二进制传输模式传输。命令应该是适当的RETR 命令:“RETR filename”

但你写的是:

ftp.retrbinary('RETR' + filename, localfile.write, 1024)
这将产生如下结果:

ftp.retrbinary('RETRdog.jpg', localfile.write, 1024)
您需要在“RETR”之后添加一个空格

使用python创建您自己的ftp服务器 顺便说一下,您可以编写一个简短的python程序,用作ftp服务器。首先安装模块
pyftpdlib

$ pip3.4 install pyftpdlib  #See note on 3.4 below
如果您的系统上只有一个python版本,您可以编写:

$ pip install pyftpdlib
如果您的计算机上有多个python版本,请将正确的版本号替换为3.4。您指定的版本号是pyftpdlib模块将安装的python版本

以下是python中ftp服务器的外观:

from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer

my_authorizer = DummyAuthorizer()
my_authorizer.add_user(
    username = '7stud', 
    password = '1234', 
    homedir = '.', 
    perm='elrw'  #permissions: 'e'->change dir, 'l'->list files, 'r'->retrieve files, 'w'->store a file to the server
)

my_handler = FTPHandler
my_handler.authorizer = my_authorizer

port = 2121
my_handler.banner = "You connected to my ftp server on port: {}".format(port)

address = ('localhost', port)
server = FTPServer(address, my_handler)

server.max_cons = 256
server.max_cons_per_ip = 5

server.serve_forever()
pyftpdlib
文档和教程。
添加用户()
和描述的权限

然后,您可以为服务器创建目录:

$ mkdir ftp_server
$ cd ftp_server
$ touch my_ftp_server.py
将上面的代码放入文件
my\u ftp\u server.py
。然后将一些文件添加到ftp_服务器目录,以便练习“下载”。然后通过运行my_ftp_server.py启动服务器

在另一个终端窗口中,将目录切换到包含python程序的目录:

$ cd python_programs
然后对ftp客户端程序进行一些小更改:

from ftplib import FTP

def getfile(conn):  #It's good practice not to refer to global variables in your functions.
                    #Instead, pass in any values your function needs as arguments.
    conn.retrlines('LIST')   # List directory contents

    filename = input('Name of file: ')
    localfile = open(filename, 'wb')
    ftp_command = 'RETR {}'.format(filename)

    conn.retrbinary(ftp_command, localfile.write, 1024)

    localfile.close()

user = '7stud'
passw = '1234'
port = 2121

url = input('FTP url: ').lower().strip()

ftp = FTP()
ftp.connect(url, port)
ftp.login(user, passw) 
getfile(ftp)
ftp.quit()
~/python_programs$ python3.4 ftp_client.py 
FTP url: localhost

drwxr-xr-x   4 7stud    staff         136 Feb 11 09:07 cgi-bin
-rw-r--r--   1 7stud    staff        3446 Jun 08  2013 client_socket.py
-rw-r--r--   1 7stud    staff         680 Feb 15 03:03 ftp_server.py
-rw-r--r--   1 7stud    staff         721 Feb 12 03:01 http_server.py
-rw-r--r--   1 7stud    staff         498 Jan 01 07:10 index.html
-rw-r--r--   1 7stud    staff          68 Jan 01 05:03 oneliner.py
-rw-r--r--   1 7stud    staff         954 Feb 11 09:05 socket_server.py
-rw-r--r--   1 7stud    staff           0 Feb 15 02:50 test.png

Name of file: test.png

~/python_programs$ ls *.png
bar_freq.png  example.png   test.png

~/python_programs$ 
以下是ftp客户端程序的运行示例:

from ftplib import FTP

def getfile(conn):  #It's good practice not to refer to global variables in your functions.
                    #Instead, pass in any values your function needs as arguments.
    conn.retrlines('LIST')   # List directory contents

    filename = input('Name of file: ')
    localfile = open(filename, 'wb')
    ftp_command = 'RETR {}'.format(filename)

    conn.retrbinary(ftp_command, localfile.write, 1024)

    localfile.close()

user = '7stud'
passw = '1234'
port = 2121

url = input('FTP url: ').lower().strip()

ftp = FTP()
ftp.connect(url, port)
ftp.login(user, passw) 
getfile(ftp)
ftp.quit()
~/python_programs$ python3.4 ftp_client.py 
FTP url: localhost

drwxr-xr-x   4 7stud    staff         136 Feb 11 09:07 cgi-bin
-rw-r--r--   1 7stud    staff        3446 Jun 08  2013 client_socket.py
-rw-r--r--   1 7stud    staff         680 Feb 15 03:03 ftp_server.py
-rw-r--r--   1 7stud    staff         721 Feb 12 03:01 http_server.py
-rw-r--r--   1 7stud    staff         498 Jan 01 07:10 index.html
-rw-r--r--   1 7stud    staff          68 Jan 01 05:03 oneliner.py
-rw-r--r--   1 7stud    staff         954 Feb 11 09:05 socket_server.py
-rw-r--r--   1 7stud    staff           0 Feb 15 02:50 test.png

Name of file: test.png

~/python_programs$ ls *.png
bar_freq.png  example.png   test.png

~/python_programs$ 

好了,就这样。谢谢我想我真的需要更加注意我的语法。总是简单的事情。再次感谢@马龙,不客气!有一种更好的方法来构造字符串:
ftp\u cmd=“RETR{}”.format(filename)
然后
ftp.retrbinary(ftp\u cmd,localfile.write,1024)
。请参见此处的format()示例:。您还可以为ftp服务器使用python程序。在我的文章的结尾看到如何。太棒了,谢谢你提供关于创建ftp服务器的更多信息,我猜这是我的下一个项目!