Sto costruendo un'app per automatizzare alcuni processi che sono fastidiosi da fare a mano (cercare in un file, prendere certe informazioni da un file, costruire un altro file con quelle informazioni).
Il mio progetto ha tre parti principali: app.py, che parla all'utente e utilizza webpy per creare un'interfaccia semplice; maker.py, che contiene un insieme di funzioni che fanno il sollevamento pesante; e una cartella di modelli html. C'è anche una cartella statica, che è dove l'applicazione mette i risultati del suo duro lavoro.
L'unico modo per far funzionare questo casino è se app.py e maker.py si trovano nella stessa cartella. Questo non mi piace per il modo in cui i vari tutorial mi hanno detto di configurare le mie cartelle, però. Se non sono nella stessa cartella, ottengo errori come "nessun modulo chiamato maker". Un altro problema è che non riesco a vedere alcuna buona ragione per cui la classe FragmentMaker possa esistere del tutto. Perché non posso avere un file pieno di funzioni e solo importare l'intera cosa così com'è?
Qual è il modo migliore per configurare le cartelle per questo tipo di progetto? Maker.py e app.py sono presenti in diverse cartelle? In tal caso, come faccio a importare maker.py in modo da poter usare il codice che ho inserito?
Il lato web, app.py:
import web
from maker import FragmentMaker #can't make this work
urls = ('/upload', 'Upload',
'/make_link', 'Make_Link'
)
app = web.application(urls, globals())
render = web.template.render('templates/')
maker = FragmentMaker() #this doesn't work either
class Upload:
def GET(self):
return render.upload_form()
def POST(self):
x = web.input(myfile={})
filename = x['myfile'].filename
input_file = x['myfile'].file # returns a file-like object
if '.docx' in filename: #Runs the docx side of fragment maker
E_supinfo = maker.makeList(input_file)
maker.WriteFrag(E_supinfo)
elif '.csv' in filename: #Runs for everything else
Other_supinfo = maker.ProcessCSV(input_file)
maker.WriteFrag(Other_supinfo)
else: #For unsupported file types
return render.error_page(filename)
return render.upload_confirm(filename)
class Make_Link:
def GET(self):
return render.make_link('NONE')
def POST(self):
instring = web.input(accession = 'NONE')
E_Link = maker.makeLink(instring.accession)
return render.make_link(E_Link)
if __name__ == "__main__":
app.run()
E questo è maker.py, più o meno:
import a bunch of useful things other people have built
class FragmentMaker: #does '(object)' need to be in here?
def __init__(self):
self.joy = "service is my only joy" #do I need a variable here? Nothing uses this.
def Thing1(self, stuff_for_thing1):
useful code here.
def ProcessCSV(self, other):
more code that works
def makeLink(self, acnum):
code here
def makeList(docname): # does 'self' have to be in these?
E_List = Thing1(docname) #calling a function from inside another function is ok, right?
code: then a miracle happens.
... e così via.
la mia struttura di file:
makefrag
|-bin
app.py
|-docs
empty for now
|-Fragment_Maker
__init__.py
maker.py
|-static
results go here
|-templates
html files here
|-tests
all sorts of random test files and code in here
__init__.py