Код Python работает в Linux, ошибка возникает в окнах (обратная косая черта)

Итак, у меня есть личный проект, который, как я знаю, довольно неэффективен, но работает. Я пишу код Python, который выполняет версию tesseract без pip (apt, установленную в Linux). Мой код работает в Linux, но я получаю эту ошибку в Windows:

FileNotFoundError: [WinError 2] Система не может найти указанный файл: 'DRIVE_LETTER:\PROJECT_FOLDER\FOLDER/FILE.txt'

Я использую Atom IDE, новичок в python, поэтому, если кто-нибудь может указать на мои идиотские ошибки, я был бы признателен, спасибо! Ошибка возникает в строке subprocess.run , потому что файл error.txt говорит, что не может найти конкретный путь.

Это мой код:

      from flask import Flask,url_for,redirect,render_template,request,send_file
from werkzeug.utils import secure_filename
import subprocess

app=Flask(__name__)
app.config['UPLOAD_DIRECTORY']="uploads/"
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":
        if request.files['fileupload']:
            f=request.files['fileupload']
            filename=secure_filename(f.filename)
            app.config['FILE_NAME']=filename
            f.save(app.config['UPLOAD_DIRECTORY']+filename)
            return redirect(url_for("process_upload",filename=filename))
        else:
            err_msg="No file selected!"
    return render_template("index.html",error=err_msg)

@app.route("/upload/<filename>",methods=["POST","GET"])
def process_upload(filename):
    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("output_file"))

@app.route("/result/",methods=["GET"])
def output_file():
    return render_template("output.html")

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

if __name__=="__main__":
    app.run(host="0.0.0.0",port="2000",debug=True)

РЕДАКТИРОВАТЬ: Наконец-то заработало! Удалено / в app.config['UPLOAD_DIRECTORY'] и app.config['OUTPUT_DIRECTORY'], так как теперь я использую os.path.join, и это следующие строки для Linux и Windows, с которыми я заставил их работать:

Линукс:

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

Окна:

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

Спасибо всем за ваш вклад!

1 ответ

Этот вопрос здесь неуместен; его следует задать на сайте StackOverflow , так как это общий вопрос по программированию и никоим образом не относится к Ubuntu.

Но ответ на ваш вопрос довольно прост: вы вручную создаете пути к файлам в своем коде, используя в качестве разделителя имен файлов, как здесь:

          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)

Хотя это действительно работает в Linux, это не может работать в Windows, потому что разделитель имен файлов в Windows — это, а не . винда не распознает /в качестве разделителя имен файлов, а также Linux не распознает \.

Если вы хотите иметь независимый от ОС код, используйте для соединения частей пути, поэтому вместо этого, например, "logs/out.txt"использовать os.path.join("logs","out.txt"). os.path.join()объединяет свои аргументы с разделителем, подходящим для используемой ОС.

Другие вопросы по тегам