我有一个非常简单的实用程序脚本,在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
答案 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 line,command freezing。
我尝试禁用&#34; QuickEdit模式&#34; cmd的选项。它有效!