如何使Python程序路径独立?

0 投票
1 回答
759 浏览
提问于 2025-04-16 19:10
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')

这两个文件在完全不同的路径下,所以显然会出现错误。我想要解决两个问题。

  1. 我不想指定 "data/Parking.shp" 这个路径。它应该自动从上传的文件中获取名称,并在 automate.py 中使用这个名称。

  2. automate.py 需要使用 maps/models.py。因为我在另一个路径下执行这个文件,所以这也会导致错误。那么我该如何让代码不受这些路径错误的影响呢?

1 个回答

0
  1. 与其在命令行中调用你的 unzip.py 模块,不如直接把它当作一个 Python 模块来用(比如 import unzip),这样就能得到解压缩的方法结果。这只需要做一些基本的调整。

  2. 你可以通过模块的 __file__ 参数来获取模块的目录,像这个问题所示。需要注意的是,这个方法只在命令行中有效(比如 python toto.py),在 IDLE 中就不行了(详细解释可以在这里找到)。

撰写回答