Apa format file biner di python?

Format distribusi biner () awalnya didefinisikan dalam PEP 427. Versi spesifikasi saat ini ada di sini

Abstrak

PEP ini menjelaskan format paket bawaan untuk Python yang disebut "roda"

Roda adalah arsip format ZIP dengan nama file yang diformat khusus dan ekstensi .whl. Ini berisi satu distribusi hampir seperti yang akan diinstal menurut PEP 376 dengan skema instalasi tertentu. Meskipun penginstal khusus disarankan, file roda dapat diinstal hanya dengan membongkar ke dalam paket situs dengan alat 'unzip' standar sambil menyimpan informasi yang cukup untuk menyebarkan kontennya ke jalur terakhirnya di lain waktu.

Penerimaan PEP

PEP ini diterima, dan versi roda yang ditentukan diperbarui ke 1. 0, oleh Nick Coghlan pada 16 Februari 2013

Alasan

Python membutuhkan format paket yang lebih mudah dipasang daripada sdist. Paket sdist Python ditentukan oleh dan membutuhkan sistem build distutils dan setuptools, menjalankan kode sewenang-wenang untuk membangun dan menginstal, dan mengkompilasi ulang, kode agar dapat diinstal ke virtualenv baru. Sistem penggabungan build-install ini lambat, sulit dipelihara, dan menghambat inovasi baik dalam sistem build maupun installer

Wheel mencoba memperbaiki masalah ini dengan menyediakan antarmuka yang lebih sederhana antara sistem build dan penginstal. Format paket wheel binary membebaskan penginstal dari keharusan mengetahui sistem build, menghemat waktu dengan mengamortisasi waktu kompilasi pada banyak penginstalan, dan menghilangkan kebutuhan untuk menginstal sistem build di lingkungan target

Detail

Memasang roda 'distribusi-1. 0-py32-none-any. apa

Pemasangan roda konon terdiri dari dua tahap

  • Membongkar

    1. Mengurai distribution-1.0.dist-info/WHEEL

    2. Periksa apakah penginstal kompatibel dengan Wheel-Version. Peringatkan jika versi minor lebih besar, batalkan jika versi mayor lebih besar

    3. Jika Root-Is-Purelib == 'true', ekstrak arsip ke dalam purelib (paket situs)

    4. Jika tidak, bongkar arsip ke dalam platlib (paket situs)

  • Menyebar

    1. Arsip yang dibongkar termasuk distribution-1.0.dist-info/ dan (jika ada data) distribution-1.0.data/

    2. Pindahkan setiap subpohon dari distribution-1.0.data/ ke jalur tujuannya. Setiap subdirektori dari distribution-1.0.data/ adalah kunci ke dict direktori tujuan, seperti

      distribution-1.0.dist-info/
      
      distribution-1.0.data/
      
      1. Jalur yang awalnya didukung diambil dari
      distribution-1.0.dist-info/
      
      distribution-1.0.data/
      
      2

    3. Jika berlaku, perbarui skrip yang dimulai dengan

      distribution-1.0.dist-info/
      
      distribution-1.0.data/
      
      3 untuk menunjuk ke juru bahasa yang benar

    4. Perbarui

      distribution-1.0.dist-info/
      
      distribution-1.0.data/
      
      _4 dengan jalur yang diinstal

    5. Hapus direktori

      distribution-1.0.dist-info/
      
      distribution-1.0.data/
      
      _5 kosong

    6. Kompilasi semua yang diinstal. py ke. pyc. (Uninstallers harus cukup pintar untuk menghapus. pyc meskipun tidak disebutkan dalam RECORD. )

Fitur penginstal yang direkomendasikan

Tulis ulang
distribution-1.0.dist-info/

distribution-1.0.data/
_3

Di roda, skrip dikemas dalam

distribution-1.0.dist-info/

distribution-1.0.data/
7. Jika baris pertama file di
distribution-1.0.dist-info/

distribution-1.0.data/
8 dimulai dengan persis
distribution-1.0.dist-info/

distribution-1.0.data/
9, tulis ulang untuk menunjuk ke juru bahasa yang benar. Penginstal Unix mungkin perlu menambahkan +x bit ke file ini jika arsip dibuat di Windows

Konvensi

file.py,sha256=AVTFPZpEKzuHr7OvQZmhaU3LvwKz06AJw8mT\_pNh2yI,3144
distribution-1.0.dist-info/RECORD,,
0 diizinkan.
file.py,sha256=AVTFPZpEKzuHr7OvQZmhaU3LvwKz06AJw8mT\_pNh2yI,3144
distribution-1.0.dist-info/RECORD,,
_0 menunjukkan skrip GUI alih-alih skrip konsol

Hasilkan pembungkus skrip

Di roda, skrip yang dikemas pada sistem Unix pasti tidak akan menyertai. pembungkus exe. Penginstal Windows mungkin ingin menambahkannya selama penginstalan

Fitur pengarsipan yang direkomendasikan

Tempatkan
file.py,sha256=AVTFPZpEKzuHr7OvQZmhaU3LvwKz06AJw8mT\_pNh2yI,3144
distribution-1.0.dist-info/RECORD,,
_2 di akhir arsip

Pengarsip didorong untuk menempatkan

file.py,sha256=AVTFPZpEKzuHr7OvQZmhaU3LvwKz06AJw8mT\_pNh2yI,3144
distribution-1.0.dist-info/RECORD,,
2 file secara fisik di akhir arsip. Ini memungkinkan beberapa trik ZIP yang berpotensi menarik termasuk kemampuan untuk mengubah metadata tanpa menulis ulang seluruh arsip

Format File

Konvensi nama file

Nama file roda adalah

file.py,sha256=AVTFPZpEKzuHr7OvQZmhaU3LvwKz06AJw8mT\_pNh2yI,3144
distribution-1.0.dist-info/RECORD,,
_4

distribusi

Nama distribusi, e. g. 'django', 'piramida'

Versi: kapan

Versi distribusi, e. g. 1. 0

membangun tag

Nomor build opsional. Harus dimulai dengan angka. Bertindak sebagai pemecah ikatan jika nama file dua roda sama dalam semua hal lainnya (mis. e. nama, versi, dan tag lainnya). Urutkan sebagai tupel kosong jika tidak ditentukan, selain itu urutkan sebagai tupel dua item dengan item pertama sebagai digit awal sebagai

file.py,sha256=AVTFPZpEKzuHr7OvQZmhaU3LvwKz06AJw8mT\_pNh2yI,3144
distribution-1.0.dist-info/RECORD,,
5, dan item kedua sebagai sisa tag sebagai
file.py,sha256=AVTFPZpEKzuHr7OvQZmhaU3LvwKz06AJw8mT\_pNh2yI,3144
distribution-1.0.dist-info/RECORD,,
6

implementasi bahasa dan tag versi

E. g. 'py27', 'py2', 'py3'

tag abi

E. g. 'cp33m', 'abi3', 'tidak ada'

tag platform

E. g. 'linux_x86_64', 'apa saja'

Misalnya,

file.py,sha256=AVTFPZpEKzuHr7OvQZmhaU3LvwKz06AJw8mT\_pNh2yI,3144
distribution-1.0.dist-info/RECORD,,
_7 adalah build pertama dari paket yang disebut 'distribusi', dan kompatibel dengan Python 2. 7 (Python 2. 7 implementasi), tanpa ABI (Python murni), pada arsitektur CPU apa pun

Tiga komponen terakhir dari nama file sebelum ekstensi disebut “tag kompatibilitas. ” Tag kompatibilitas mengungkapkan persyaratan juru bahasa dasar paket dan dirinci dalam PEP 425

Melarikan diri dan Unicode

Karena komponen nama file dipisahkan oleh tanda hubung (

file.py,sha256=AVTFPZpEKzuHr7OvQZmhaU3LvwKz06AJw8mT\_pNh2yI,3144
distribution-1.0.dist-info/RECORD,,
8, HYPHEN-MINUS), karakter ini tidak dapat muncul di dalam komponen mana pun. Ini ditangani sebagai berikut

  • Dalam nama distribusi, setiap

    file.py,sha256=AVTFPZpEKzuHr7OvQZmhaU3LvwKz06AJw8mT\_pNh2yI,3144
    distribution-1.0.dist-info/RECORD,,
    
    _9 karakter (HYPHEN-MINUS, LOW LINE dan FULL STOP) harus diganti dengan
    { "hash": "sha256=ADD-r2urObZHcxBW3Cr-vDCu5RJwT4CaRTHiFmbcIYY" }
    
    0 (LOW LINE), dan karakter huruf besar harus diganti dengan huruf kecil yang sesuai. Ini setara dengan reguler diikuti dengan mengganti
    file.py,sha256=AVTFPZpEKzuHr7OvQZmhaU3LvwKz06AJw8mT\_pNh2yI,3144
    distribution-1.0.dist-info/RECORD,,
    
    8 dengan
    { "hash": "sha256=ADD-r2urObZHcxBW3Cr-vDCu5RJwT4CaRTHiFmbcIYY" }
    
    0. Alat yang memakan roda harus disiapkan untuk menerima
    { "hash": "sha256=ADD-r2urObZHcxBW3Cr-vDCu5RJwT4CaRTHiFmbcIYY" }
    
    3 (FULL STOP) dan huruf besar, bagaimanapun, karena ini diizinkan oleh versi sebelumnya dari spesifikasi ini

  • Nomor versi harus dinormalisasi menurut PEP 440. Nomor versi yang dinormalisasi tidak boleh berisi

    file.py,sha256=AVTFPZpEKzuHr7OvQZmhaU3LvwKz06AJw8mT\_pNh2yI,3144
    distribution-1.0.dist-info/RECORD,,
    
    8

  • Komponen yang tersisa tidak boleh mengandung

    file.py,sha256=AVTFPZpEKzuHr7OvQZmhaU3LvwKz06AJw8mT\_pNh2yI,3144
    distribution-1.0.dist-info/RECORD,,
    
    _8 karakter, jadi tidak perlu melarikan diri

Alat yang memproduksi roda harus memverifikasi bahwa komponen nama file tidak mengandung

file.py,sha256=AVTFPZpEKzuHr7OvQZmhaU3LvwKz06AJw8mT\_pNh2yI,3144
distribution-1.0.dist-info/RECORD,,
8, karena file yang dihasilkan mungkin tidak diproses dengan benar jika mengandung

Nama file arsip adalah Unicode. Perlu beberapa saat sebelum alat diperbarui untuk mendukung nama file non-ASCII, tetapi didukung dalam spesifikasi ini

Nama file di dalam arsip dikodekan sebagai UTF-8. Meskipun beberapa klien ZIP yang umum digunakan tidak menampilkan nama file UTF-8 dengan benar, penyandian didukung oleh spesifikasi ZIP dan

{ "hash": "sha256=ADD-r2urObZHcxBW3Cr-vDCu5RJwT4CaRTHiFmbcIYY" }
7 Python

isi berkas

Isi file roda, di mana {distribution} diganti dengan nama paket, mis. g.

{ "hash": "sha256=ADD-r2urObZHcxBW3Cr-vDCu5RJwT4CaRTHiFmbcIYY" }
_8 dan {version} diganti dengan versinya, mis. g.
{ "hash": "sha256=ADD-r2urObZHcxBW3Cr-vDCu5RJwT4CaRTHiFmbcIYY" }
_9, terdiri dari

  1. # urlsafe-base64-nopad for Python 3
    import base64
    
    def urlsafe_b64encode_nopad(data):
        return base64.urlsafe_b64encode(data).rstrip(b'=')
    
    def urlsafe_b64decode_nopad(data):
        pad = b'=' * (4 - (len(data) & 3))
        return base64.urlsafe_b64decode(data + pad)
    
    0, root dari arsip, berisi semua file yang akan dipasang di
    # urlsafe-base64-nopad for Python 3
    import base64
    
    def urlsafe_b64encode_nopad(data):
        return base64.urlsafe_b64encode(data).rstrip(b'=')
    
    def urlsafe_b64decode_nopad(data):
        pad = b'=' * (4 - (len(data) & 3))
        return base64.urlsafe_b64decode(data + pad)
    
    1 atau
    # urlsafe-base64-nopad for Python 3
    import base64
    
    def urlsafe_b64encode_nopad(data):
        return base64.urlsafe_b64encode(data).rstrip(b'=')
    
    def urlsafe_b64decode_nopad(data):
        pad = b'=' * (4 - (len(data) & 3))
        return base64.urlsafe_b64decode(data + pad)
    
    2 sebagaimana ditentukan dalam
    # urlsafe-base64-nopad for Python 3
    import base64
    
    def urlsafe_b64encode_nopad(data):
        return base64.urlsafe_b64encode(data).rstrip(b'=')
    
    def urlsafe_b64decode_nopad(data):
        pad = b'=' * (4 - (len(data) & 3))
        return base64.urlsafe_b64decode(data + pad)
    
    3.
    # urlsafe-base64-nopad for Python 3
    import base64
    
    def urlsafe_b64encode_nopad(data):
        return base64.urlsafe_b64encode(data).rstrip(b'=')
    
    def urlsafe_b64decode_nopad(data):
        pad = b'=' * (4 - (len(data) & 3))
        return base64.urlsafe_b64decode(data + pad)
    
    1 dan
    # urlsafe-base64-nopad for Python 3
    import base64
    
    def urlsafe_b64encode_nopad(data):
        return base64.urlsafe_b64encode(data).rstrip(b'=')
    
    def urlsafe_b64decode_nopad(data):
        pad = b'=' * (4 - (len(data) & 3))
        return base64.urlsafe_b64decode(data + pad)
    
    2 biasanya keduanya
    # urlsafe-base64-nopad for Python 3
    import base64
    
    def urlsafe_b64encode_nopad(data):
        return base64.urlsafe_b64encode(data).rstrip(b'=')
    
    def urlsafe_b64decode_nopad(data):
        pad = b'=' * (4 - (len(data) & 3))
        return base64.urlsafe_b64decode(data + pad)
    
    6

  2. # urlsafe-base64-nopad for Python 3
    import base64
    
    def urlsafe_b64encode_nopad(data):
        return base64.urlsafe_b64encode(data).rstrip(b'=')
    
    def urlsafe_b64decode_nopad(data):
        pad = b'=' * (4 - (len(data) & 3))
        return base64.urlsafe_b64decode(data + pad)
    
    7 berisi metadata

  3. # urlsafe-base64-nopad for Python 3
    import base64
    
    def urlsafe_b64encode_nopad(data):
        return base64.urlsafe_b64encode(data).rstrip(b'=')
    
    def urlsafe_b64decode_nopad(data):
        pad = b'=' * (4 - (len(data) & 3))
        return base64.urlsafe_b64decode(data + pad)
    
    8 berisi satu subdirektori untuk setiap kunci skema pemasangan tidak kosong yang belum tercakup, di mana nama subdirektori adalah indeks ke dalam kamus jalur pemasangan (mis. g.
    # urlsafe-base64-nopad for Python 3
    import base64
    
    def urlsafe_b64encode_nopad(data):
        return base64.urlsafe_b64encode(data).rstrip(b'=')
    
    def urlsafe_b64decode_nopad(data):
        pad = b'=' * (4 - (len(data) & 3))
        return base64.urlsafe_b64decode(data + pad)
    
    9, .whl0, .whl1,
    # urlsafe-base64-nopad for Python 3
    import base64
    
    def urlsafe_b64encode_nopad(data):
        return base64.urlsafe_b64encode(data).rstrip(b'=')
    
    def urlsafe_b64decode_nopad(data):
        pad = b'=' * (4 - (len(data) & 3))
        return base64.urlsafe_b64decode(data + pad)
    
    1,
    # urlsafe-base64-nopad for Python 3
    import base64
    
    def urlsafe_b64encode_nopad(data):
        return base64.urlsafe_b64encode(data).rstrip(b'=')
    
    def urlsafe_b64decode_nopad(data):
        pad = b'=' * (4 - (len(data) & 3))
        return base64.urlsafe_b64decode(data + pad)
    
    2)

  4. Skrip Python harus muncul di .whl_0 dan dimulai dengan tepat

    distribution-1.0.dist-info/
    
    distribution-1.0.data/
    
    9 untuk menikmati pembuatan pembungkus skrip dan
    distribution-1.0.dist-info/
    
    distribution-1.0.data/
    
    3 penulisan ulang pada waktu penginstalan. Mereka mungkin memiliki atau tidak memiliki ekstensi

  5. .whl_7 adalah Metadata versi 1. Metadata format 1 atau lebih besar

  6. .whl8 adalah metadata tentang arsip itu sendiri dalam kunci dasar yang sama. format nilai

    Wheel-Version: 1.0
    Generator: bdist_wheel 1.0
    Root-Is-Purelib: true
    Tag: py2-none-any
    Tag: py3-none-any
    Build: 1
    

  7. .whl_9 adalah nomor versi spesifikasi Roda

  8. distribution-1.0.dist-info/WHEEL_0 adalah nama dan secara opsional versi perangkat lunak yang menghasilkan arsip

  9. distribution-1.0.dist-info/WHEEL_1 benar jika direktori tingkat atas dari arsip harus diinstal ke dalam purelib;

  10. distribution-1.0.dist-info/WHEEL_2 adalah tag kompatibilitas roda yang diperluas;

  11. distribution-1.0.dist-info/WHEEL_4 adalah nomor build dan dihilangkan jika tidak ada nomor build

  12. Penginstal wheel harus memperingatkan jika Wheel-Version lebih besar dari versi yang didukungnya, dan harus gagal jika Wheel-Version memiliki versi mayor yang lebih besar daripada versi yang didukungnya

  13. Wheel, menjadi format instalasi yang dimaksudkan untuk bekerja di berbagai versi Python, umumnya tidak disertakan. file pyc

  14. Roda tidak berisi pengaturan. py atau setup. cfg

Versi spesifikasi wheel ini didasarkan pada skema instalasi distutils dan tidak menentukan cara menginstal file ke lokasi lain. Tata letak menawarkan superset dari fungsionalitas yang disediakan oleh format wininst dan egg binary yang ada

Itu. direktori dist-info
  1. Roda. direktori dist-info menyertakan minimal METADATA, WHEEL, dan RECORD

  2. METADATA adalah metadata paket, format yang sama dengan PKG-INFO seperti yang ditemukan di root sdists

  3. RODA adalah metadata roda khusus untuk pembuatan paket

  4. RECORD adalah daftar (hampir) semua file di roda dan hash amannya. Tidak seperti PEP 376, setiap file kecuali RECORD, yang tidak dapat berisi hash itu sendiri, harus menyertakan hashnya. Algoritme hash harus sha256 atau lebih baik;

  5. INSTALLER dan REQUESTED PEP 376 tidak termasuk dalam arsip

  6. CATATAN. jws digunakan untuk tanda tangan digital. Itu tidak disebutkan dalam RECORD

  7. CATATAN. p7s diizinkan sebagai rasa hormat kepada siapa saja yang lebih suka menggunakan tanda tangan S/MIME untuk mengamankan file wheel mereka. Itu tidak disebutkan dalam RECORD

  8. Selama ekstraksi, penginstal roda memverifikasi semua hash di RECORD terhadap konten file. Selain RECORD dan tanda tangannya, penginstalan akan gagal jika ada file dalam arsip yang tidak disebutkan dan di-hash dengan benar di RECORD

Itu. direktori data

File apa pun yang biasanya tidak diinstal di dalam paket situs masuk ke. direktori data, dinamakan sebagai. direktori dist-info tetapi dengan. data/ ekstensi

distribution-1.0.dist-info/

distribution-1.0.data/

Itu. direktori data berisi subdirektori dengan skrip, header, dokumentasi dan sebagainya dari distribusi. Selama penginstalan, konten subdirektori ini dipindahkan ke jalur tujuannya

File roda yang ditandatangani

File roda menyertakan RECORD tambahan yang memungkinkan tanda tangan digital. RECORD PEP 376 diubah untuk menyertakan hash aman distribution-1.0.dist-info/WHEEL5 (enkode urlsafe base64 tanpa trailing = karakter) sebagai kolom kedua, bukan md5sum. Semua entri yang mungkin di-hash, termasuk file apa pun yang dihasilkan seperti. pyc, tetapi bukan RECORD yang tidak dapat berisi hashnya sendiri. Misalnya

file.py,sha256=AVTFPZpEKzuHr7OvQZmhaU3LvwKz06AJw8mT\_pNh2yI,3144
distribution-1.0.dist-info/RECORD,,
_

File tanda tangan RECORD. jws dan REKOR. p7s sama sekali tidak disebutkan dalam RECORD karena hanya dapat ditambahkan setelah RECORD dibuat. Setiap file lain dalam arsip harus memiliki hash yang benar di RECORD atau penginstalan akan gagal

Jika tanda tangan web JSON digunakan, satu atau lebih tanda tangan JSON Web Signature JSON Serialization (JWS-JS) disimpan dalam file RECORD. jws bersebelahan dengan RECORD. JWS digunakan untuk menandatangani RECORD dengan menyertakan hash SHA-256 dari RECORD sebagai muatan JSON tanda tangan

{ "hash": "sha256=ADD-r2urObZHcxBW3Cr-vDCu5RJwT4CaRTHiFmbcIYY" }

(Nilai hash adalah format yang sama yang digunakan dalam RECORD. )

Jika REKAM. p7s digunakan, harus berisi tanda tangan format S/MIME terpisah dari RECORD

Penginstal roda tidak diharuskan untuk memahami tanda tangan digital tetapi HARUS memverifikasi hash di RECORD terhadap konten file yang diekstraksi. Saat penginstal memeriksa hash file terhadap RECORD, pemeriksa tanda tangan terpisah hanya perlu menetapkan bahwa RECORD cocok dengan tanda tangan

Melihat

  • https. //datatracker. ietf. org/doc/html/rfc7515

  • https. //datatracker. ietf. org/doc/html/draft-jones-json-web-signature-json-serialization-01

  • https. //datatracker. ietf. org/doc/html/rfc7517

  • https. //datatracker. ietf. org/doc/html/draft-jones-jose-json-private-key-01

Dibandingkan dengan. telur

  1. Roda adalah format instalasi; . Arsip roda tidak perlu disertakan. pyc dan kurang terikat dengan versi atau implementasi Python tertentu. Wheel dapat menginstal paket (Python murni) yang dibangun dengan versi Python sebelumnya sehingga Anda tidak harus selalu menunggu pembuat paket mengejar

  2. Penggunaan roda. direktori dist-info; . telur-info. Wheel kompatibel dengan dunia baru kemasan Python dan konsep baru yang dibawanya

  3. Wheel memiliki konvensi penamaan file yang lebih kaya untuk dunia multi-implementasi saat ini. Arsip roda tunggal dapat menunjukkan kompatibilitasnya dengan sejumlah versi dan implementasi bahasa Python, ABI, dan arsitektur sistem. Secara historis ABI khusus untuk rilis CPython, roda siap untuk ABI stabil

  4. Roda tidak rugi. Implementasi roda pertama bdist_wheel selalu menghasilkan info-telur, dan kemudian mengubahnya menjadi a. whl. Dimungkinkan juga untuk mengonversi telur yang ada dan distribusi bdist_wininst

  5. Roda berversi. Setiap file roda berisi versi spesifikasi roda dan implementasi yang mengemasnya. Semoga migrasi selanjutnya bisa ke Wheel 2 saja. 0

  6. Wheel adalah referensi ke Python lainnya

FAQ

Roda mendefinisikan a. direktori data. Haruskah saya meletakkan semua data saya di sana?

Spesifikasi ini tidak memiliki pendapat tentang bagaimana Anda harus mengatur kode Anda. Itu. direktori data hanyalah tempat untuk file apa pun yang biasanya tidak diinstal di dalam

# urlsafe-base64-nopad for Python 3
import base64

def urlsafe_b64encode_nopad(data):
    return base64.urlsafe_b64encode(data).rstrip(b'=')

def urlsafe_b64decode_nopad(data):
    pad = b'=' * (4 - (len(data) & 3))
    return base64.urlsafe_b64decode(data + pad)
6 atau di PYTHONPATH. Dengan kata lain, Anda dapat terus menggunakan distribution-1.0.dist-info/WHEEL_7 meskipun file tersebut biasanya tidak didistribusikan di direktori distribution-1.0.dist-info/WHEEL8 wheel

Mengapa roda menyertakan tanda tangan terlampir?

Tanda tangan yang dilampirkan lebih nyaman daripada tanda tangan yang terpisah karena mereka bepergian dengan arsip. Karena hanya file individual yang ditandatangani, arsip dapat dikompres ulang tanpa membatalkan tanda tangan atau file individual dapat diverifikasi tanpa harus mengunduh seluruh arsip

Mengapa wheel mengizinkan tanda tangan JWS?

Spesifikasi JOSE yang menjadi bagian JWS dirancang agar mudah diimplementasikan, fitur yang juga merupakan salah satu tujuan desain utama roda. JWS menghasilkan implementasi Python murni yang berguna dan ringkas

Mengapa wheel juga mengizinkan tanda tangan S/MIME?

Tanda tangan S/MIME diizinkan untuk pengguna yang membutuhkan atau ingin menggunakan infrastruktur kunci publik yang ada dengan wheel

Paket yang ditandatangani hanyalah blok bangunan dasar dalam sistem pembaruan paket yang aman. Roda hanya menyediakan blok bangunan

Apa masalahnya dengan "purelib" vs. "platlib"?

Roda mempertahankan "purelib" vs. perbedaan “platlib”, yang signifikan pada beberapa platform. Misalnya, Fedora menginstal paket Python murni ke '/usr/lib/pythonX. Y/site-packages’ dan paket yang bergantung pada platform ke ‘/usr/lib64/pythonX. Y/paket-situs’

Sebuah roda dengan “Root-Is-Purelib. false” dengan semua filenya di distribution-1.0.dist-info/WHEEL9 setara dengan roda dengan “Root-Is-Purelib. true” dengan file yang sama di root, dan legal untuk memiliki file dalam kategori “purelib” dan “platlib”

Dalam praktiknya, roda seharusnya hanya memiliki satu "purelib" atau "platlib" tergantung pada apakah itu Python murni atau tidak dan file-file itu harus berada di root dengan pengaturan yang sesuai diberikan untuk "Root-is-purelib"

Apakah mungkin mengimpor kode Python langsung dari file roda?

Secara teknis, karena kombinasi penginstalan pendukung melalui ekstraksi sederhana dan penggunaan format arsip yang kompatibel dengan distribution-1.0.dist-info/0, subkumpulan file roda mendukung ditempatkan langsung di distribution-1.0.dist-info/1. Namun, meskipun perilaku ini merupakan konsekuensi alami dari desain format, sebenarnya tidak disarankan untuk mengandalkannya

Pertama, wheel dirancang terutama sebagai format distribusi, jadi melewatkan langkah penginstalan juga berarti sengaja menghindari ketergantungan pada fitur yang mengasumsikan penginstalan penuh (seperti dapat menggunakan alat standar seperti distribution-1.0.dist-info/2 dan distribution-1.0.dist-info/3 untuk menangkap dan mengelola dependensi dengan cara yang

Kedua, sementara beberapa perangkat lunak Python ditulis untuk mendukung berjalan langsung dari arsip zip, kode masih umum ditulis dengan asumsi telah diinstal sepenuhnya. Ketika asumsi itu dipatahkan dengan mencoba menjalankan perangkat lunak dari arsip zip, kegagalan seringkali tidak jelas dan sulit didiagnosis (terutama ketika terjadi di perpustakaan pihak ketiga). Dua sumber masalah yang paling umum dengan hal ini adalah fakta bahwa mengimpor ekstensi C dari arsip zip tidak didukung oleh CPython (karena hal itu tidak didukung langsung oleh mesin pemuatan dinamis pada platform apa pun) dan ketika dijalankan dari arsip zip . Bahkan ketika perangkat lunak menggunakan API sumber daya abstrak dengan benar secara internal, berinteraksi dengan komponen eksternal mungkin masih memerlukan ketersediaan file pada disk yang sebenarnya

Seperti metaclasses, monkeypatching, dan importir metapath, jika Anda belum yakin perlu memanfaatkan fitur ini, Anda hampir pasti tidak membutuhkannya. Jika Anda tetap memutuskan untuk menggunakannya, ketahuilah bahwa banyak proyek akan membutuhkan kegagalan untuk direproduksi dengan paket yang terinstal sepenuhnya sebelum menerimanya sebagai bug asli.

Perubahan

Sejak PEP 427, spesifikasi ini telah berubah sebagai berikut

  • Aturan untuk melarikan diri dalam nama file roda telah direvisi, agar sejalan dengan apa yang sebenarnya dilakukan alat populer (Februari 2021)

    Apa itu format file biner?

    File biner adalah file yang isinya dalam format biner yang terdiri dari serangkaian byte berurutan, yang masing-masing panjangnya delapan bit. The content must be interpreted by a program or a hardware processor that understands in advance exactly how that content is formatted and how to read the data.

    Bagaimana Anda menulis file biner dengan Python?

    Untuk menulis string biner ke file biner, Anda perlu membuka file dalam mode “binary write” menggunakan 'wb' sebagai argumen posisi kedua dari open() . Misalnya, Anda akan menulis open('my_file. bin', 'wb') bukannya open('my_file. bin', 'w'). . For instance, you'd write open('my_file. bin', 'wb') instead of open('my_file. bin', 'w') .

    Bagaimana cara membaca file biner dengan Python?

    Untuk membaca dari file biner, kita perlu membukanya dengan mode rb daripada mode default rt . >>> dengan open("exercises. zip", mode="rb") sebagai zip_file. . isi = zip_file. membaca().