Рейтинг:-1

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

флаг br

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

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

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

Это мой код:

из flask import Flask,url_for,redirect,render_template,request,send_file
из werkzeug.utils импортировать secure_filename
подпроцесс импорта

приложение = фляга (__имя__)
app.config['UPLOAD_DIRECTORY']="загрузки/"
app.config['ИМЯ_ФАЙЛА']=""
app.config['OUTPUT_DIRECTORY']="текстовый результат/"
app.config['РАСШИРЕНИЕ']=".txt"

@app.route("/",methods=["POST","GET"])
защита to_upload():
    ошибка_сообщения = ""
    если запрос.метод=="POST":
        если запрос.файлы['fileupload']:
            f=request.files['fileupload']
            имя_файла=secure_filename(f.filename)
            app.config['FILE_NAME']=имя файла
            f.save(app.config['UPLOAD_DIRECTORY']+имя файла)
            вернуть перенаправление (url_for ("process_upload", имя_файла = имя файла))
        еще:
            err_msg="Файл не выбран!"
    вернуть render_template ("index.html", error=err_msg)

@app.route("/upload/<filename>",methods=["POST","GET"])
def process_upload (имя файла):
    f1=открыть("журналы/out.txt","w")
    f2=открыть("журналы/error.txt","w")
    out=subprocess.run([f"tesseract uploads/{имя файла}"+f" textresult/{имя файла}"],shell=True,stdout=f1,stderr=f2)
    вернуть перенаправление (url_for ("output_file"))

@app.route("/result/",methods=["GET"])
деф выходной_файл():
    вернуть render_template("output.html")

@app.route("/скачать/")
def download_file():
    файл=app.config['OUTPUT_DIRECTORY']+app.config['ИМЯ_ФАЙЛА']+app.config['РАСШИРЕНИЕ']
    вернуть send_file (файл, as_attachment = True)

если __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'],имя файла)
convert2txt=os.path.join(app.config['OUTPUT_DIRECTORY'],имя файла)
out=subprocess.run(["tesseract %s %s"%(to_convert,convert2txt)],shell=True,stdout=f1,stderr=f2)

Окна:

to_convert=os.path.join(app.config['UPLOAD_DIRECTORY'],имя файла)
convert2txt=os.path.join(app.config['OUTPUT_DIRECTORY'],имя файла)
out=subprocess.run(["tesseract",to_convert,convert2txt],shell=True,stdout=f1,stderr=f2)

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

muru avatar
флаг us
Используйте [`pathlib`](https://docs.python.org/3/library/pathlib.html), чтобы манипулировать путями вместо того, чтобы разделывать их вручную.
raj avatar
флаг cn
raj
Этот вопрос следует задавать на StackOverflow, а не здесь; это общий вопрос программирования и не имеет ничего общего с Ubuntu в частности.
флаг cn
для меня это проблема Windows: P «Код Python работает в Linux, ошибка возникает в Windows (обратная косая черта)»
itpug avatar
флаг br
Спасибо вам всем, я нечасто бываю здесь, но, поскольку я изучаю python, я подумал, что должен снова заглянуть в этот аккаунт через несколько лет. Но я мог бы поклясться, что разместил это на stalkoverflow, извините, технически я здесь новичок, поэтому я не знал о правилах. Но за выходы большое спасибо! Редактировать: теперь я понял, в правом верхнем углу я нажал askubuntu вместо stackoverflow, мой плохой.
Рейтинг:4
флаг cn
raj

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

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

    f1=открыть("журналы/out.txt","w")
    f2=открыть("журналы/error.txt","w")
    out=subprocess.run([f"tesseract uploads/{имя файла}"+f" textresult/{имя файла}"],shell=True,stdout=f1,stderr=f2)

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

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

itpug avatar
флаг br
Извините, приму к сведению правила форума и большое спасибо за ваш ответ!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.