Python qrcode ไม่สอดคล้องกัน

ฉันมีปัญหาแปลกๆ กับ python-qrcode

ฉันใช้งานมันได้ในสภาพแวดล้อมการพัฒนาของเรามาระยะหนึ่งแล้ว โดยไม่มีปัญหาใดๆ เราใช้มันเพื่อสร้างโค้ด QR สองโค้ด ซึ่งทั้งสองโค้ดมี URL ที่มีความยาวเกือบเท่ากันทุกประการ (อันหนึ่งมีตัวอักษรพิเศษและเครื่องหมายทับพิเศษสองตัว) จำเป็นอย่างยิ่งที่รหัสทั้งสองนี้จะต้องมีขนาดเท่ากันทุกประการ

เนื่องจากเราตั้งค่า python-qrcode เมื่อประมาณห้าเดือนที่แล้ว ทุก ๆ qrcode ที่เราสร้างขึ้นจึงมีขนาดเท่ากันทุกประการโดยไม่ล้มเหลว อย่างไรก็ตาม ตอนนี้เราได้ส่งทุกอย่างไปยังเซิร์ฟเวอร์ที่ใช้งานจริงแล้ว และทันใดนั้นเราก็ประสบปัญหา

โดยพื้นฐานแล้ว หนึ่งในรหัสที่เราสร้างมีขนาดใหญ่กว่าปกติ (นี่คือรหัสที่มีอักขระพิเศษสามตัว) อีกรหัสคือขนาดที่ถูกต้อง รหัสทั้งสองถูกสร้างขึ้นโดยใช้ฟังก์ชันเดียวกันทุกประการ เราเพียงส่ง URL ที่แตกต่างกันเพื่อเข้ารหัส

บนเครื่องของฉันและบนเซิร์ฟเวอร์ dev ของเรา qrcode ทั้งหมดมีขนาดเท่ากันทุกประการ (รวมถึงอันที่มีอักขระพิเศษด้วย) แต่บนเซิร์ฟเวอร์ที่ใช้งานจริง อันที่ยาวกว่าจะใหญ่กว่าในขณะที่อีกอันนั้นถูกต้อง

เราใช้การควบคุมเวอร์ชัน Git ดังนั้นไฟล์/ฟังก์ชันทั้งหมด ฯลฯ จะเหมือนกันระหว่างเซิร์ฟเวอร์ ข้อแตกต่างระหว่างการตั้งค่าคือเวอร์ชันของ Ubuntu (12.04 กับ 12.10 บนเซิร์ฟเวอร์ที่ใช้งานจริง) แต่ฉันไม่เห็นสาเหตุที่ทำให้เกิดปัญหานี้

ถ้าโค้ดทั้งสองใหญ่กว่านี้ ผมก็เข้าใจได้ แต่ผมก็ไม่เข้าใจว่าทำไมโค้ดหนึ่งถึงใหญ่กว่าโค้ดอีกอันบนเซิร์ฟเวอร์เดียวเท่านั้น.....?

หากใครสามารถเสนอแนะได้ว่าจะเริ่มดำเนินการได้ที่ไหน ฉันจะขอบคุณมาก!

แก้ไข:

นี่คือรหัสที่เกี่ยวข้อง:

myQrGenerator = qrcode.QRCode(
    version=QRCODE_SIZE,
    error_correction=qrcode.constants.ERROR_CORRECT_M,
    box_size=QRCODE_BOX_SIZE,
    border=QRCODE_BORDER_SIZE
)

myQrGenerator.add_data('%s%s/' % (theBaseUrl, str(theHash)))
myQrGenerator.make(fit=True)

เราได้รับตัวแปรเหล่านั้นจาก local_settings.py


person Erve1879    schedule 03.12.2012    source แหล่งที่มา
comment
เมื่อพูดถึงขนาด คุณหมายถึงขนาดไฟล์ของภาพที่ได้ใช่ไหม   -  person soulseekah    schedule 03.12.2012
comment
ขออภัย - ใช่ ผลลัพธ์ที่ได้คือขนาดภาพแบบขอบจรดขอบ   -  person Erve1879    schedule 03.12.2012
comment
โปรดแสดงรหัสที่เกี่ยวข้อง เช่น วิธีที่คุณใช้ API ของ python-qrcode   -  person soulseekah    schedule 03.12.2012
comment
หากเรียกผ่านค่าเริ่มต้น make python-qrcode จะ พยายามทำให้พอดี ข้อมูลและอาจปรับขนาดรูปภาพได้ ใช้ print_tty เพื่อพิมพ์รหัสลงบนหน้าจอเพื่อหลีกเลี่ยง PIL โดยสิ้นเชิง และตัดการทำงานที่ผิดปกติออก   -  person soulseekah    schedule 03.12.2012
comment
นอกจากนี้ความแตกต่างคืออะไร? ความกว้างและความสูงหนึ่งพิกเซล QR? พิกเซลภาพดิบหลายภาพ? บางทีคุณสามารถแสดงภาพด้วยตัวเองและสตริงที่เข้ารหัสเพื่อที่เราจะได้ลองด้วยตัวเอง?   -  person soulseekah    schedule 03.12.2012
comment
จะลองดูตอนนี้ ขอบคุณ soulseekah   -  person Erve1879    schedule 03.12.2012
comment
ข้อแตกต่างคือรูปภาพมีขนาดใหญ่กว่า 50 พิกเซล (พิกเซลรูปภาพดิบ) ในทั้งสองมิติ   -  person Erve1879    schedule 03.12.2012
comment
พิกเซล QR มีจำนวนเท่ากันหรือแค่ใหญ่กว่าเท่านั้น หากเป็นเช่นนั้น ดูเหมือนว่าเป็นปัญหา PIL แม้ว่าฉันจะยังนึกไม่ออกว่าทำไมและอย่างไร มีตัวแปรหลายตัวที่ถูกป้อนจากด้านบน ที่นี่ github.com/lincolnloop/python-qrcode/blob/master/qrcode/image/ บางทีคุณอาจใช้โค้ดนั้นบนทั้งสองเครื่องเพื่อค้นหาความแตกต่างในตัวแปรและเลื่อนไปยังแหล่งที่มาของตัวแปรเหล่านี้ .   -  person soulseekah    schedule 03.12.2012
comment
พิกเซล QR มีขนาดเท่ากัน - มีมากกว่านั้นในโค้ดที่ไม่ถูกต้อง (และเค้าโครงแตกต่างกันมาก) อย่างไรก็ตาม รหัสทั้งสองส่งผลให้มี URL เดียวกัน   -  person Erve1879    schedule 03.12.2012
comment
ดังนั้นจึงดูเหมือนจะไม่เป็นปัญหา PIL หากกล่อง QR มีขนาดเท่ากัน แต่มีมากกว่านั้น PIL จะทำในสิ่งที่บอกว่าทำ ฉันสามารถสรุปได้ว่า print_tty บนเครื่องทั้งสองเครื่องให้ผลการทำงานเหมือนกัน โดยที่ 12.10 จะสร้างโค้ด QR ที่ใหญ่กว่า (พร้อมกล่องมากกว่า) สำหรับ URL ที่ยาวกว่า และเกี่ยวกับรหัสทั้งสองผลลัพธ์ใน URL เดียวกัน ขอพูดตรงๆ นะ เมื่อสแกนโค้ด คุณจะได้รับข้อมูลเดียวกันกลับแม้ว่าคุณจะป้อนข้อมูลต่างกันก็ตาม!?   -  person soulseekah    schedule 03.12.2012
comment
ฉันยอมรับว่าดูเหมือนจะไม่เป็นปัญหา PIL คุณจะต้องช่วยฉันในเรื่อง print.tty - ฉันได้รับข้อผิดพลาดทางไวยากรณ์ที่ไม่ถูกต้อง บิต URL เดียวกัน: เมื่อฉันป้อน URL เดียวกันบนเซิร์ฟเวอร์ที่แตกต่างกัน เซิร์ฟเวอร์ที่ใช้งานจริงส่งคืนโค้ด QR ที่ใหญ่กว่า แต่มี URL เดียวกันกับโค้ดที่สร้างโดยเซิร์ฟเวอร์การพัฒนา (ซึ่งเป็นขนาดที่ถูกต้อง)   -  person Erve1879    schedule 03.12.2012


คำตอบ (2)


หลังจากการพูดคุยกันอย่างยาวนาน ก็พบว่าเซิร์ฟเวอร์ทั้งสองใช้ URL ที่แตกต่างกัน อันที่พ่นโค้ด QR ที่ใหญ่กว่า (ในรูปของพิกเซล QR และต่อมาในรูปของพิกเซลของภาพ) ล้นออกมา โดยที่ขีดจำกัดของบิตที่สามารถจัดเก็บสำหรับขนาดที่กำหนดไว้ล่วงหน้านั้นไม่เพียงพอ และ qrcode ทำให้พอดีโดยการเพิ่ม จำนวนข้อมูลที่สามารถจัดเก็บได้

เพื่อแก้ไขปัญหานี้ fit ถูกตั้งค่า False เพื่อให้มีข้อจำกัดสำหรับการโอเวอร์โฟลว์ และ version ถูกเพิ่มเพื่อรองรับบิตมากขึ้นตั้งแต่เริ่มต้น box_size สามารถลดลงได้เล็กน้อยเพื่อรักษาขนาดภาพต้นฉบับ ไม่มากก็น้อย

person soulseekah    schedule 03.12.2012

อาจมีความแตกต่างในวิธีการติดตั้ง PIL บนกล่อง เมื่อดูที่แหล่งที่มาของ python-qrcode ทำ:

try:
    from PIL import Image, ImageDraw
except ImportError:
    import Image, ImageDraw

ดูว่าเกิดอะไรขึ้นเมื่อคุณทำ:

from PIL import Image, ImageDraw

ในแต่ละเครื่อง ไม่ว่าจะด้วยวิธีใดถ้ามันไม่ใช่จุดบกพร่องในรหัสแอปพลิเคชัน (ตรวจสอบให้แน่ใจเป็นสองเท่าว่ามีรหัสเดียวกันในแต่ละกล่อง) ดูเหมือนว่ามันจะเป็นเพราะความแตกต่างบางประการในวิธีที่ PIL สร้างตัวเองบน Ubuntu 12.10 กับ 12.04 อาจเป็นเพราะส่วนหัว / libs ที่ใช้ในการคอมไพล์ที่แตกต่างกัน ตรวจสอบให้แน่ใจว่าการติดตั้ง PIL สอดคล้องกับกล่องอื่นๆ

person Purrell    schedule 03.12.2012
comment
ขอบคุณ Purrell - ฉันคงต้องอยู่ในเปลือกหลามใช่ไหม ฉันไม่ได้รับการตอบสนอง (ข้อผิดพลาดหรืออย่างอื่น) เมื่อฉันรันสิ่งนั้นในไพ ธ อนเชลล์ - person Erve1879; 03.12.2012