Score:-1

รหัส Python ทำงานบน linux เกิดข้อผิดพลาดบน windows (แบ็กสแลช)

ธง br

ฉันจึงมีโครงการส่วนตัวซึ่งฉันรู้ว่าค่อนข้างไม่มีประสิทธิภาพแต่ได้ผล ฉันกำลังเขียนโค้ดหลามที่เรียกใช้ tesseract รุ่นที่ไม่ใช่ pip (ติดตั้ง apt ใน linux) รหัสของฉันทำงานบน linux แต่ฉันได้รับข้อผิดพลาดนี้บน windows:

FileNotFoundError: [WinError 2] ระบบไม่พบไฟล์ ระบุ: 'DRIVE_LETTER:\PROJECT_FOLDER\FOLDER/FILE.txt'

ฉันใช้ Atom IDE ซึ่งค่อนข้างใหม่สำหรับ python ดังนั้นถ้าใครสามารถชี้ข้อผิดพลาดงี่เง่าของฉันได้ ฉันจะขอบคุณมาก ขอบคุณ! ข้อผิดพลาดเกิดขึ้นที่ subprocess.run บรรทัดเนื่องจากไฟล์ error.txt แจ้งว่าไม่พบเส้นทางเฉพาะ

นี่คือรหัสของฉัน:

จากขวดนำเข้า Flask,url_for,redirect,render_template,request,send_file
จาก werkzeug.utils นำเข้า secure_filename
นำเข้ากระบวนการย่อย

แอป = กระติกน้ำ (__ชื่อ__)
app.config['UPLOAD_DIRECTORY']="อัปโหลด/"
app.config['FILE_NAME']=""
app.config['OUTPUT_DIRECTORY']="textresult/"
app.config['EXTENSION']=".txt"

@app.route("/",methods=["POST","GET"])
def to_upload():
    err_msg=""
    ถ้า request.method=="POST":
        ถ้า request.files['fileupload']:
            f=request.files['ไฟล์อัพโหลด']
            ชื่อไฟล์=secure_filename(f.ชื่อไฟล์)
            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=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)
    ส่งคืนการเปลี่ยนเส้นทาง (url_for ("output_file"))

@app.route("/result/",methods=["GET"])
def output_file():
    ส่งคืน render_template("output.html")

@app.route("/ดาวน์โหลด/")
def download_file():
    file=app.config['OUTPUT_DIRECTORY']+app.config['FILE_NAME']+app.config['EXTENSION']
    ส่งกลับ 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'],ชื่อไฟล์)
converter2txt=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'],ชื่อไฟล์)
converter2txt=os.path.join(app.config['OUTPUT_DIRECTORY'],ชื่อไฟล์)
out=subprocess.run(["tesseract",to_convert,convert2txt],shell=True,stdout=f1,stderr=f2)

ขอขอบคุณทุกท่านสำหรับข้อมูลของคุณ!

muru avatar
us flag
ใช้ [`pathlib`](https://docs.python.org/3/library/pathlib.html) เพื่อจัดการเส้นทางแทนการฆ่าด้วยตนเอง
raj avatar
cn flag
raj
ควรถามคำถามนี้ใน StackOverflow มากกว่าที่นี่ เป็นคำถามเกี่ยวกับการเขียนโปรแกรมทั่วไปและไม่เกี่ยวข้องกับอูบุนตูโดยเฉพาะ
cn flag
สำหรับฉันนี่เป็นปัญหาของ windows : P "รหัส Python ทำงานบน linux เกิดข้อผิดพลาดบน windows (แบ็กสแลช)"
itpug avatar
br flag
ขอบคุณทุกท่าน ฉันไม่ได้มาที่นี่บ่อยนัก แต่เนื่องจากฉันกำลังเรียนรู้ python ฉันคิดว่าฉันควรเลิกใช้บัญชีนี้อีกครั้งหลังจากผ่านไปสองสามปี แต่ฉันสาบานได้ว่าฉันโพสต์สิ่งนี้บน stalkoverflow ขออภัยฉันค่อนข้างใหม่ทางเทคนิคดังนั้นฉันจึงไม่ทราบกฎ แต่ขอบคุณมากสำหรับผลลัพธ์! แก้ไข: ตอนนี้ฉันเข้าใจแล้ว ที่มุมบนขวาฉันคลิกที่ askubuntu แทน stackoverflow แย่จัง
Score:4
ธง cn
raj

คำถามนี้ไม่ได้อยู่ในนี้ มันควรจะถามบน สแต็คโอเวอร์โฟลว์ เนื่องจากเป็นคำถามเกี่ยวกับการเขียนโปรแกรมทั่วไปและไม่ใช่เฉพาะ 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 ไม่รู้จัก / เนื่องจากตัวคั่นชื่อไฟล์และลินุกซ์ไม่รู้จักเช่นเดียวกัน \.

หากคุณต้องการมีรหัสที่ไม่ขึ้นกับระบบปฏิบัติการ ให้ใช้ os.path.join() เพื่อเข้าร่วมส่วนต่างๆ ของชื่อพาธ ตัวอย่างเช่น แทน "logs/out.txt" ใช้ os.path.join("บันทึก","out.txt"). os.path.join() รวมอาร์กิวเมนต์ด้วยตัวคั่นที่ถูกต้องสำหรับระบบปฏิบัติการที่ใช้

itpug avatar
br flag
ฉันขอโทษ ฉันจะรับทราบแนวทางของฟอรัมและขอบคุณมากสำหรับคำตอบของคุณ!

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา