Điểm:-1

Mã Python hoạt động trên linux, xảy ra lỗi trên windows (dấu gạch chéo ngược)

lá cờ br

Vì vậy, tôi có một dự án cá nhân mà tôi biết là khá kém hiệu quả nhưng vẫn hiệu quả. Tôi đang viết mã python thực thi phiên bản không phải pip của tesseract (apt được cài đặt trong linux). Mã của tôi hoạt động trên linux, nhưng tôi gặp lỗi này trên windows:

FileNotFoundError: [WinError 2] Hệ thống không thể tìm thấy tệp đã chỉ định: 'DRIVE_LETTER:\PROJECT_FOLDER\FOLDER/FILE.txt'

Tôi đang sử dụng Atom IDE, khá mới đối với python, vì vậy nếu có ai có thể chỉ ra những lỗi ngu ngốc của tôi, tôi sẽ đánh giá cao điều đó, cảm ơn! Lỗi xảy ra trên quy trình con.run dòng vì tệp error.txt nói rằng nó không thể tìm thấy đường dẫn cụ thể.

Đây là mã của tôi:

từ bình nhập Flask,url_for,redirect,render_template,request,send_file
từ werkzeug.utils nhập secure_filename
quy trình con nhập khẩu

ứng dụng=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=""
    nếu request.method=="POST":
        nếu request.files['fileupload']:
            f=request.files['fileupload']
            tên tệp=secure_filename(f.filename)
            app.config['FILE_NAME']=tên tệp
            f.save(app.config['UPLOAD_DIRECTORY']+tên tệp)
            chuyển hướng trở lại (url_for(" process_upload ", tên tệp = tên tệp))
        khác:
            err_msg="Không có tập tin nào được chọn!"
    trả về render_template("index.html",error=err_msg)

@app.route("/upload/<filename>",methods=["POST","GET"])
def process_upload(tên tệp):
    f1=open("log/out.txt","w")
    f2=open("log/error.txt","w")
    out=sub process.run([f"tesseract uploads/{filename}"+f" textresult/{filename}"],shell=True,stdout=f1,stderr=f2)
    chuyển hướng trở lại (url_for ("output_file"))

@app.route("/result/",methods=["GET"])
def đầu ra_file():
    trả về render_template("output.html")

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

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

CHỈNH SỬA: Cuối cùng đã có nó để làm việc! Đã xóa / trong app.config['UPLOAD_DIRECTORY'] và app.config['OUTPUT_DIRECTORY'] vì hiện tại tôi đang sử dụng os.path.join và đây là những dòng sau cho cả Linux và Windows mà tôi đã làm cho chúng hoạt động tại:

Linux:

to_convert=os.path.join(app.config['UPLOAD_DIRECTORY'],tên tệp)
convert2txt=os.path.join(app.config['OUTPUT_DIRECTORY'],tên tệp)
out=sub process.run(["tesseract %s %s"%(to_convert,convert2txt)],shell=True,stdout=f1,stderr=f2)

Các cửa sổ:

to_convert=os.path.join(app.config['UPLOAD_DIRECTORY'],tên tệp)
convert2txt=os.path.join(app.config['OUTPUT_DIRECTORY'],tên tệp)
out=sub process.run(["tesseract",to_convert,convert2txt],shell=True,stdout=f1,stderr=f2)

Cảm ơn tất cả các đầu vào của bạn!

muru avatar
lá cờ us
Sử dụng [`pathlib`](https://docs.python.org/3/library/pathlib.html) để điều khiển các đường dẫn thay vì cắt chúng theo cách thủ công
raj avatar
lá cờ cn
raj
Câu hỏi này nên được hỏi trên StackOverflow hơn là ở đây; đó là một câu hỏi lập trình chung và không liên quan gì đến Ubuntu nói riêng.
lá cờ cn
với tôi đây là sự cố của windows:P "Mã Python hoạt động trên linux, xảy ra lỗi trên windows (dấu gạch chéo ngược)"
itpug avatar
lá cờ br
Cảm ơn tất cả các bạn, mình không thường xuyên vào đây nhưng vì đang học python nên vài năm nữa mình nên ghé qua tài khoản này. Nhưng tôi có thể thề rằng tôi đã đăng bài này trên rình rập, xin lỗi vì tôi khá mới ở đây về mặt kỹ thuật nên tôi không biết về các quy tắc. Nhưng cảm ơn bạn rất nhiều cho kết quả đầu ra! Chỉnh sửa: Bây giờ tôi hiểu rồi, ở góc trên cùng bên phải, tôi đã nhấp vào askubuntu thay vì stackoverflow, thật tệ.
Điểm:4
lá cờ cn
raj

Câu hỏi này không thuộc về nơi này; nó nên được hỏi trên StackOverflow trang web vì đây là một câu hỏi lập trình chung và không phải là dành riêng cho Ubuntu.

Nhưng câu trả lời cho câu hỏi của bạn khá đơn giản: bạn đang tạo thủ công đường dẫn đến tệp trong mã của mình bằng cách sử dụng / làm dấu tách tên tệp, như ở đây:

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

Mặc dù điều này thực sự hoạt động trong Linux, nhưng nó không thể hoạt động trong Windows, vì dấu tách tên tệp trong Windows là \ và không /. Windows không nhận ra / làm dấu tách tên tệp và tương tự như vậy Linux không nhận ra \.

Nếu bạn muốn có mã độc lập với hệ điều hành, hãy sử dụng os.path.join() để tham gia các phần của tên đường dẫn, vì vậy thay vào đó, ví dụ "log/out.txt" sử dụng os.path.join("log","out.txt"). os.path.join() kết hợp các đối số của nó với một dấu phân cách phù hợp với hệ điều hành được sử dụng.

itpug avatar
lá cờ br
Tôi xin lỗi, sẽ lưu ý với các hướng dẫn của diễn đàn và cảm ơn bạn rất nhiều vì câu trả lời của bạn!

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.