![Python 代码在 Linux 上运行,在 Windows 上发生错误(反斜杠)](https://linux22.com/image/1184223/Python%20%E4%BB%A3%E7%A0%81%E5%9C%A8%20Linux%20%E4%B8%8A%E8%BF%90%E8%A1%8C%EF%BC%8C%E5%9C%A8%20Windows%20%E4%B8%8A%E5%8F%91%E7%94%9F%E9%94%99%E8%AF%AF%EF%BC%88%E5%8F%8D%E6%96%9C%E6%9D%A0%EF%BC%89.png)
所以我有一个个人项目,我知道它效率很低,但可以工作。我正在编写一个执行非 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()
将其参数与适合所用操作系统的分隔符连接起来。