Puncte:-1

Codul Python funcționează pe Linux, eroarea apare pe Windows (barele oblice inverse)

drapel br

Deci am un proiect personal despre care știu că este destul de ineficient, dar funcționează. Scriu un cod python care execută versiunea non pip a tesseract (apt instalat în linux). Codul meu funcționează pe Linux, dar primesc această eroare pe Windows:

FileNotFoundError: [WinError 2] Sistemul nu poate găsi fișierul specificat: „DRIVE_LETTER:\PROJECT_FOLDER\FOLDER/FILE.txt”

Folosesc IDE-ul Atom, destul de nou în python, așa că dacă cineva îmi poate sublinia greșelile idioate, aș aprecia, mulțumesc! Eroarea apare pe subproces.run linie deoarece fișierul error.txt spune că nu poate găsi calea specifică.

Acesta este codul meu:

din flask import Flask,url_for,redirect,render_template,request,send_file
din werkzeug.utils import secure_filename
subproces de import

app=Flask(__nume__)
app.config['UPLOAD_DIRECTORY']="încărcări/"
app.config['FILE_NAME']=""
app.config['OUTPUT_DIRECTORY']="textresult/"
app.config['EXTENSION']=".txt"

@app.route("/",methods=["POST","GET"])
def to_upload():
    err_msg=""
    if request.method="POST":
        dacă request.files['fileupload']:
            f=request.files['fileupload']
            nume_fișier=nume_fișier_securizat(f.nume fișier)
            app.config['FILE_NAME']=nume fișier
            f.save(app.config['UPLOAD_DIRECTORY']+nume fișier)
            return redirect(url_for("process_upload",filename=filename))
        altceva:
            err_msg="Niciun fișier selectat!"
    returnează șablon de randare("index.html",error=err_msg)

@app.route("/upload/<filename>",methods=["POST","GET"])
def process_upload(nume fișier):
    f1=open("logs/out.txt","w")
    f2=open("logs/error.txt","w")
    out=subprocess.run([f"tesseract uploads/{filename}"+f" textresult/{filename}"],shell=True,stdout=f1,stderr=f2)
    return redirect(url_for("fișier_ieșire"))

@app.route("/rezultat/",methods="GET"])
def fișier_ieșire():
    return render_template("output.html")

@app.route("/descărcare/")
def download_file():
    file=app.config['OUTPUT_DIRECTORY']+app.config['FILE_NAME']+app.config['EXTENSION']
    return send_file(file,as_attachment=True)

dacă __name__=="__main__":
    app.run(gazdă="0.0.0.0",port="2000",debug=True)

EDITAȚI | ×: In sfarsit a pus treaba! Eliminat / în app.config['UPLOAD_DIRECTORY'] și app.config['OUTPUT_DIRECTORY'], deoarece acum folosesc os.path.join și acestea sunt următoarele linii atât pentru Linux, cât și pentru Windows, la care le-am făcut să lucreze:

Linux:

to_convert=os.path.join(app.config['UPLOAD_DIRECTORY'],nume fișier)
convert2txt=os.path.join(app.config['OUTPUT_DIRECTORY'],nume fișier)
out=subprocess.run(["tesseract %s %s"%(to_convert,convert2txt)],shell=True,stdout=f1,stderr=f2)

Windows:

to_convert=os.path.join(app.config['UPLOAD_DIRECTORY'],nume fișier)
convert2txt=os.path.join(app.config['OUTPUT_DIRECTORY'],nume fișier)
out=subprocess.run(["tesseract",to_convert,convert2txt],shell=True,stdout=f1,stderr=f2)

Vă mulțumim tuturor pentru contribuții!

muru avatar
drapel us
Utilizați [`pathlib`](https://docs.python.org/3/library/pathlib.html) pentru a manipula căile în loc să le tăiați manual
raj avatar
drapel cn
raj
Această întrebare ar trebui pusă pe StackOverflow mai degrabă decât aici; este o întrebare generală de programare și nu are nimic de-a face cu Ubuntu în special.
drapel cn
pentru mine, aceasta este o problemă cu Windows: P "Codul Python funcționează pe Linux, apare eroarea pe Windows (barele oblice inverse)"
itpug avatar
drapel br
Vă mulțumesc tuturor, nu sunt frecvent aici, dar din moment ce învăț python m-am gândit că ar trebui să trec din nou pe acest cont după câțiva ani. Dar aș fi putut jura că am postat asta pe stalkoverflow, îmi pare rău că sunt destul de nou aici din punct de vedere tehnic, așa că nu eram la curent cu regulile. Dar vă mulțumesc foarte mult pentru rezultate! Edit: Acum am înțeles, în colțul din dreapta sus am dat clic pe askubuntu în loc de stackoverflow, rău.
Puncte:4
drapel cn
raj

Această întrebare nu este aici; ar trebui să fie întrebat StackOverflow deoarece aceasta este o întrebare generală de programare și nu este în niciun caz specifică Ubuntu.

Dar răspunsul la întrebarea dvs. este destul de simplu: creați manual căi către fișierele din codul dvs. utilizând / ca separator de nume de fișier, ca aici:

    f1=open("logs/out.txt","w")
    f2=open("logs/error.txt","w")
    out=subprocess.run([f"tesseract uploads/{filename}"+f" textresult/{filename}"],shell=True,stdout=f1,stderr=f2)

Deși acest lucru funcționează într-adevăr în Linux, nu poate funcționa în Windows, deoarece separatorul de nume de fișier în Windows este \ si nu /. Windows nu recunoaște / ca separator de nume de fișier și, de asemenea, Linux nu recunoaște \.

Dacă doriți să aveți un cod independent de sistemul de operare, utilizați os.path.join() pentru a uni părțile numelui căii, deci, de exemplu „logs/out.txt” utilizare os.path.join("logs","out.txt"). os.path.join() își unește argumentele cu un separator care este corect pentru sistemul de operare utilizat.

itpug avatar
drapel br
Îmi pare rău, voi lua notă de instrucțiunile forumului și vă mulțumesc foarte mult pentru răspuns!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.