Kode qr python tidak konsisten

Saya mengalami masalah yang sangat aneh dengan python-qrcode.

Saya sudah menjalankannya di lingkungan pengembang kami untuk sementara waktu sekarang, tanpa masalah apa pun. Kami menggunakannya untuk membuat dua kode QR yang keduanya berisi URL dengan panjang yang hampir sama (satu berisi huruf tambahan dan dua garis miring tambahan). Sangat penting bahwa kedua kode ini memiliki ukuran yang sama persis.

Sejak kami menyiapkan python-qrcode sekitar lima bulan yang lalu, setiap kode qr yang kami hasilkan memiliki ukuran yang persis sama tanpa gagal. Namun, kami sekarang telah memasukkan semuanya ke server produksi dan tiba-tiba kami mengalami masalah.

Pada dasarnya, salah satu kode yang kami hasilkan lebih besar dari biasanya (ini adalah kode yang memiliki tiga karakter tambahan). Kode lainnya adalah ukuran yang benar. Kedua kode tersebut dihasilkan menggunakan fungsi yang persis sama, kami hanya meneruskan URL yang berbeda untuk dikodekan.

Di mesin lokal saya dan di server pengembang kami, semua kode qr memiliki ukuran yang persis sama (termasuk yang memiliki karakter tambahan), tetapi di server produksi, yang lebih panjang akan lebih besar sementara yang lainnya benar.

Kami menggunakan kontrol versi Git, sehingga semua file/fungsi dll identik antar server. Satu-satunya perbedaan antara pengaturan adalah versi Ubuntu (12.04 vs 12.10 di server produksi), tapi saya tidak mengerti mengapa hal itu menyebabkan masalah ini.

Jika kedua kode lebih besar, saya bisa mengerti, tapi saya tidak tahu mengapa yang satu lebih besar dari yang lain hanya di satu server.....?

Jika ada yang bisa memberi saran tentang di mana harus mulai mengerjakannya, saya akan sangat berterima kasih!

Sunting:

Inilah kode yang relevan:

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)

Kami mendapatkan variabel tersebut dari local_settings.py


person Erve1879    schedule 03.12.2012    source sumber
comment
Saat Anda mengatakan ukuran, yang Anda maksud adalah ukuran file dari gambar yang dihasilkan?   -  person soulseekah    schedule 03.12.2012
comment
Maaf - ya. Ukuran gambar yang dihasilkan, edge to edge.   -  person Erve1879    schedule 03.12.2012
comment
Tolong tunjukkan kode yang relevan, yaitu bagaimana Anda menggunakan API python-qrcode.   -  person soulseekah    schedule 03.12.2012
comment
Jika dipanggil melalui make default, python-qrcode akan mencoba menyesuaikan data, dan mungkin mengubah ukuran gambar. Gunakan print_tty untuk mencetak kode ke layar untuk menghindari PIL sama sekali, dan singkirkan perilaku buruknya.   -  person soulseekah    schedule 03.12.2012
comment
Juga, apa bedanya? Lebar dan tinggi satu piksel QR? Beberapa piksel gambar mentah? Mungkin Anda juga dapat menampilkan gambarnya sendiri, dan string yang dikodekan, sehingga kami dapat mencobanya sendiri?   -  person soulseekah    schedule 03.12.2012
comment
Akan mencobanya sekarang, terima kasih soulseekah   -  person Erve1879    schedule 03.12.2012
comment
Perbedaannya adalah gambarnya lebih besar 50 piksel (piksel gambar mentah) di kedua dimensi   -  person Erve1879    schedule 03.12.2012
comment
Apakah piksel QR di dalamnya memiliki jumlah yang sama, atau hanya lebih besar? Jika ya, sepertinya masalah PIL, meski saya belum bisa membayangkan mengapa dan bagaimana. Ada beberapa variabel yang dimasukkan dari atas, di sini github.com/lincolnloop/python-qrcode/blob/master/qrcode/image/ mungkin Anda dapat menelusuri kode tersebut di kedua mesin untuk mengetahui perbedaan variabel dan berpindah ke sumber variabel ini .   -  person soulseekah    schedule 03.12.2012
comment
Piksel QR berukuran sama - ada lebih banyak piksel dalam kode yang salah (dan tata letaknya sangat berbeda). Meskipun begitu, kedua kode tersebut menghasilkan URL yang sama   -  person Erve1879    schedule 03.12.2012
comment
Jadi sepertinya bukan masalah PIL jika kotak QR berukuran sama, tetapi jumlahnya lebih banyak, PIL melakukan apa yang dikatakannya. Saya dapat berasumsi bahwa print_tty pada kedua mesin menghasilkan perilaku yang sama, dimana 12.10 menghasilkan kode QR yang lebih besar (dengan lebih banyak kotak) untuk URL yang lebih panjang. Dan mengenai kode, keduanya menghasilkan URL yang sama, izinkan saya menjelaskannya, saat memindai kode, apakah Anda mendapatkan kembali data yang sama meskipun Anda memasukkan data yang berbeda!?   -  person soulseekah    schedule 03.12.2012
comment
Saya setuju bahwa ini sepertinya bukan masalah PIL. Anda harus membantu saya dengan print.tty - Saya mendapat kesalahan sintaksis yang tidak valid. Bit URL yang sama: ketika saya memasukkan URL yang sama di server yang berbeda, server produksi mengembalikan kode QR yang lebih besar, tetapi berisi URL yang sama dengan kode yang dihasilkan oleh server pengembangan (yang ukurannya benar)   -  person Erve1879    schedule 03.12.2012


Jawaban (2)


Setelah diskusi panjang, diketahui bahwa kedua server menggunakan URL yang berbeda. Yang mengeluarkan kode QR yang lebih besar (dalam piksel QR, dan selanjutnya dalam piksel gambar) meluap, sehingga batas bit yang dapat disimpan untuk ukuran yang telah ditentukan tidak cukup, dan qrcode membuatnya sesuai dengan meningkatkan jumlah data yang dapat disimpannya.

Untuk memperbaikinya, fit ditetapkan False untuk memberikan batasan pada overflow, dan version ditingkatkan untuk mengakomodasi lebih banyak bit dari awal. box_size dapat diperkecil sedikit untuk mempertahankan, kurang lebih, ukuran gambar aslinya.

person soulseekah    schedule 03.12.2012

Mungkin ada perbedaan dalam cara PIL diinstal pada kotak. Melihat sumber python-qrcode, itu melakukan:

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

Lihat apa yang terjadi jika Anda melakukannya:

from PIL import Image, ImageDraw

Di setiap mesin. Apa pun yang terjadi jika itu benar-benar bukan bug dalam kode aplikasi (pastikan kode yang sama ada di setiap kotak), sepertinya itu terjadi karena beberapa perbedaan dalam cara PIL membangun dirinya sendiri di Ubuntu 12.10 vs 12.04, mungkin karena beberapa header/lib berbeda yang digunakannya untuk mengkompilasi. Periksa untuk memastikan instalasi PIL konsisten dengan kotak lainnya.

person Purrell    schedule 03.12.2012
comment
Terima kasih Purrell - mungkin saya harus menggunakan shell python? Saya tidak mendapat respons (kesalahan atau lainnya) ketika saya menjalankannya di shell python - person Erve1879; 03.12.2012