我刚刚开始使用pyftpdlib。我首先要做的是将示例服务器包装在一个线程中。但是如果我运行这个脚本,它就不会退出:
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
import logging
import threading
class FtpThread(threading.Thread):
def __init__(self, user_list):
self.user_list = user_list
self.killswitch = 0
threading.Thread.__init__(self)
def run(self,*args,**kwargs):
authorizer = DummyAuthorizer()
authorizer.add_user('user', 'bla', '/home/user/git/verteilerCore2/default_basedir/in/1/', perm='elradfmwM')
handler = FTPHandler
handler.authorizer = authorizer
logging.basicConfig(filename='/var/log/verteiler_ftp.log', level=logging.INFO)
handler.banner = "pyftpdlib based ftpd ready."
address = ('', 21)
self.server = FTPServer(address, handler)
self.server.max_cons = 256
self.server.max_cons_per_ip = 5
self.server.serve_forever()
def stop(self):
self.server.close_all()
def main():
ftp_server = FtpThread("")
ftp_server.start()
import time
time.sleep(1)
ftp_server.stop()
if __name__ == '__main__':
main()我要怎么做才能让server_forever停下来?调用"close_all“会使服务器停止服务,但整个脚本不会退出:(
发布于 2019-02-08 22:54:35
我遇到了同样的问题(python 2.7.14,Ubuntu 16.04)。正如https://github.com/giampaolo/pyftpdlib/blob/master/pyftpdlib/test/test_servers.py中所建议的,我通过使用ThreadedFTPServer iso FTPServer使其正常工作。
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import ThreadedFTPServer
import threading
def __init__(self, addr):
authorizer = DummyAuthorizer()
authorizer.add_anonymous(os.getcwd())
handler = FTPHandler
handler.authorizer = authorizer
handler.banner = "pyftpdlib based ftpd ready."
ThreadedFTPServer.__init__(self, addr, handler)
# set a limit for connections
self.max_cons = 256
self.max_cons_per_ip = 5
def _run_server(self):
self.serve_forever()
def start(self):
srv = threading.Thread(target=self._run_server)
srv.deamon = True
srv.start()
def stop(self):
self.close_all()-->本例中,调用"close_all“退出脚本
发布于 2014-10-28 17:54:42
在Windows8上试过了,它确实干净地退出了:
[I 14-10-28 11:49:18] >>> starting FTP server on :::21, pid=1892 <<<
[I 14-10-28 11:49:18] poller: <class 'pyftpdlib.ioloop.Select'>
[I 14-10-28 11:49:18] masquerade (NAT) address: None
[I 14-10-28 11:49:18] passive ports: None
[I 14-10-28 11:49:19] >>> shutting down FTP server (0 active fds) <<<您能提供更多关于您的设置的详细信息吗?
发布于 2019-02-10 23:55:37
如果找到了这个解决方案。已在Windows 10和Linux (Windows 10 WSL)上测试。
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import ThreadedFTPServer
import os
class MyFTPHandler(FTPHandler):
def on_file_received(self, file):
if os.path.basename(file) == 'last_file':
self.server.close_when_done()
def main():
authorizer = DummyAuthorizer()
authorizer.add_anonymous('/mnt/c/Temp/ftp' if os.name == 'posix' else r'C:\Temp\ftp', perm='w')
handler = MyFTPHandler
handler.authorizer = authorizer
server = ThreadedFTPServer(('0.0.0.0', 21), handler)
server.serve_forever()
if __name__ == '__main__':
main()https://stackoverflow.com/questions/26599859
复制相似问题