我一直在努力奋斗几个小时。我想将Django生成的文本文件发送到另一台服务器。为此我使用scp和subprocess.call()
。一切顺利,我得到return_code == 0
,但scp发送0个字节。在服务器端创建的文件为空。
我打印了执行的确切命令,路径是正确的,如果我放入一个shell,它可以很好地工作。
以下是代码:
form = SubmitForm(request.POST or None)
context['form'] = form
if request.method == 'POST':
if form.is_valid():
# write file in ~/hipercic/apps/dcor/jobs/
params_file = open('apps/dcor/jobs/job_' + datetime.today().strftime("%Y%m%d_%H%M%S") + '_params.txt', 'wb')
for key, val in form.cleaned_data.iteritems():
params_file.write(str(val) + ' \n')
params_file.close
cmd = 'scp /home/guillet/hipercic/' + params_file.name + ' guillet@helios.public.stolaf.edu:'
context['cmd'] = cmd
return_code = subprocess.call(cmd, shell=True)
context['return_code'] = return_code
return render(request, 'base_pending.html', context)
我想到了一个可能的竞争条件,文件在发送之前没有时间完全写入,但没有任何改变时间.sleep(3)。
此外,一些非常奇怪的问题和问题的核心,如果我在关闭文件后立即重新打开并读取文件,则文件为空:
with open('/home/guillet/hipercic/' + params_file.name, 'rb') as f:
print f.read() # prints nothing!!
答案 0 :(得分:0)
您已完成params_file.close
而不是params_file.close()
正确关闭文件会将数据刷新到您要写入的文件
在处理文件对象时,最好使用with
关键字。这样做的好处是文件在套件完成后正确关闭。