from django.shortcuts import render_to_response
from django.template import RequestContext
from shapes.forms import UploadForm
import os
# TODO convert this to using ModelForm with a custom Django FileField
# For now we just stick an uploaded shapefile into a project directory
def upload(request):
if request.method == 'POST':
form = UploadForm(request.POST, request.FILES)
if form.is_valid():
form.handle(request.FILES['file_obj'])
os.system('python ../../../automate.py')
#form.save() # if a modelform
#form.cleaned_data['user'] = request.user
return render_to_response('uploaded.html', RequestContext(request,{}))
else:
form = UploadForm()
return render_to_response('upload.html', RequestContext(request,{'form': form}))
这是我的代码os.system('python ../../automate.py)
我的automate.py有这个
import os
os.system('python unzip.py -z data/Parking.zip -o data/')
os.system('python manage.py ogrinspect data/Parking.shp Parking --srid=4326 --mapping --multi > output.txt')
filename='output.txt'
filename1='maps/models.py'
search="class Parking(models.Model):"
add="\n layer_id= models.ForeignKey(Sdr_Layer)"
content=open(filename,'r').read()
content=content.replace(search,search+add)
fp=open(filename,'w')
fp.write(content)
content1=open(filename1,'r').read()
search1="layer_attribute_name = models.CharField(max_length = 100)"
add1 = "\n" + content
#print add1
#print search1+add1
content1=content1 + add1
print content1
fp1=open(filename1,'w')
fp1.write(content1)
fp1.close()
fp.close()
os.system('python manage.py syncdb')
两者都处于完全不同的路径中,所以很明显它们会给我错误。我想要的是两件事。
我不想指定“data / Parking.shp”。它应该从上传的文件中获取名称,并在automate.py中使用它。
automate.py使用maps / models.py。当我在另一个路径中执行此文件时,这显然给了我一个错误。那么如何使代码独立于所有这些路径错误。
答案 0 :(得分:0)
不是在命令行中调用unzip.py
模块,而是直接将其作为python模块(import unzip
等)调用,以获取解压缩方法的结果。这应该只是基本的改编。
您可以通过__file__
参数获取模块的目录,如this other SO question所示。请注意,这仅适用于命令行(python toto.py
),而不适用于IDLE(这已得到很好的解释here)