Python 代码在 Linux 上运行,在 Windows 上发生错误(反斜杠)

Python 代码在 Linux 上运行,在 Windows 上发生错误(反斜杠)

所以我有一个个人项目,我知道它效率很低,但可以工作。我正在编写一个执行非 pip 版本的 tesseract(在 Linux 中安装的 apt)的 Python 代码。我的代码在 Linux 上运行良好,但在 Windows 上出现此错误:

FileNotFoundError:[WinError 2] 系统找不到指定的文件:“DRIVE_LETTER:\PROJECT_FOLDER\FOLDER/FILE.txt”

我正在使用 Atom IDE,对 Python 还很陌生,所以如果有人能指出我的愚蠢错误,我将不胜感激,谢谢!错误发生在子进程运行行,因为 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 上我让它们工作的以下几行:

Linux:

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

这个问题不属于这里;应该在堆栈溢出网站,因为这是一个普遍的编程问题,与 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 中的文件名分隔符是\和 不是/。Windows 无法识别/为文件名分隔符,同样,Linux 也无法识别\

如果您想要拥有独立于操作系统的代码,请使用os.path.join()来连接路径名的各个部分,因此例如"logs/out.txt"使用os.path.join("logs","out.txt").os.path.join()将其参数与适合所用操作系统的分隔符连接起来。

相关内容