python ftplib挂起上传(STOR)---而不是网络延迟

时间:2016-02-06 20:11:47

标签: python ftp

我有一个非常简单的实用程序脚本,在python 2.7上使用ftplib将web文件上传到我的远程主机。然而,storlines挂起,只是坐在那里几分钟。没有礼貌可以抛出任何异常。

  • 我已经验证连接是否来自REPL。 storlines从REPL和命令行脚本中挂起。

  • 我的测试文件是22个字节(不是KB,字节),所以事情似乎不太可能超时。另外,在REPL中,在我通过cntrl-c终止挂起的上传后,我可以从ftp.dir()获得输出,所以我知道我在某些时候没有丢失连接。

  • ftp.dir()的上述输出远大于我的测试文件,并在几秒钟内到达,所以我知道问题不是网络延迟。

  • 基于this prior SO我尝试在上传功能定义之前添加ftp.set_pasv(False),但这确实是nada。

有没有其他人对这里可能出现的问题有任何想法?这是代码:

import sys
from ftplib import FTP
ftp = FTP([MYSERVER], [MYUSER], [MYPASSWORD])
full = sys.argv[1]
path = 'public_html/' + full[:full.rfind('/') + 1]
filename = full[full.rfind('/') + 1:]
ftp.cwd(path)

def upload(method, mode, filename):
    with open(filename, mode) as fileobject:
        method('STOR' +filename, fileobject)

if filename.endswith(('.htm','.html','.py','.cgi','.js','.css','.txt','.md', '.svg')):
    upload(ftp.storlines, 'r', filename)
else:
    upload(ftp.storbinary, 'rb', filename)
ftp.quit()
print 'Done!'

而且,严重的是,这是我要上传的完整文件,文件名为test.md:

this is a test. 
#test

2 个答案:

答案 0 :(得分:0)

所以这很丑陋,但我最终找到了一个破解解决方案,它只是让真正了解网络的人编写的现有ftp应用程序能够完成工作:

char

我知道这些天你应该使用import sys import os full = sys.argv[1] path = 'public_html/' + full[:full.rfind('/') + 1] filename = full[full.rfind('/') + 1:] def picktype(filename): if filename.endswith(('.htm','.html','.py','.cgi','.js','.css','.txt','.md', '.svg')): return 'ascii' return 'binary' ftpstring = """ open [SERVER] user [USER] [PASSWORD] cd {0} {1} put {2} bye """.format(path, picktype(filename), filename) print ftpstring with open("tempfile.txt", 'w') as tempfile: tempfile.write(ftpstring) os.system('ftp -n < tempfile.txt') print 'Done!' 模块来处理这种垃圾,但我不能为我的生活找出如何使重定向工作。

答案 1 :(得分:0)

我遇到了同样的问题,比如你的问题。 当我在ms cmd控制台中运行它时,我的python ftp脚本挂起而没有任何输出。我甚至用多线程,多进程重写我的脚本但它不起作用。 但是我发现我的脚本在linux中正常工作,或者在windows上的pycharm ide中工作。

所以我认为这可能是ms cmd环境的一些问题。然后我发现了这些问题python program stops in command linecommand freezing

我尝试禁用&#34; QuickEdit模式&#34; cmd的选项。它有效!