python == python2 ATAU python == python3? Bagaimana mengemas, mendistribusikan skrip python py2k?

10

Bergantung pada sistem, python== python2atau python== python3.

Skrip Python yang dapat dieksekusi, dimulai dengan:

#!/usr/bin/env python
#!/usr/bin/env python2
#!/usr/bin/env python3...

Untuk python py3k disediakan dalam dokumentasi saya harus / dapat menggunakannya dengan nomor versi , jadi saya melakukan ini:

#!/usr/bin/env python3

Tapi saya telah menemukan masalah dengan skrip py2k.

Sementara di dokumentasi py2k ada tertulis penggunaan: #! /usr/bin/env python,

pada beberapa * nix-es python py3k adalah default, jadi python == python3. (Misalnya paket python ArchLinux , di sini file paket python ).

Bagaimana cara mengemas (mengkonfigurasi, membuat) dan / atau menyiapkan skrip python untuk distribusi untuk mengatasinya?

Saya bertanya tentang membuat paket perangkat lunak yang dapat dijalankan dengan mudah oleh pengguna (tanpa mengubah lingkungan mereka)

Dapatkah saya melakukan trik yang sama untuk script python py2k sebagai untuk script python py3k dan mengaturnya sebagai: #!/usr/bin/env python2? Bisakah saya memastikan bahwa setiap distribusi python py2k berisi python2file, jadi #!/usr/bin/env python2akan berfungsi?

Jika ya, mengapa tidak diusulkan sebagai standar, misalnya dalam dokumentasi python py2k ?

Grzegorz Wierzowiecki
sumber
4
Sejauh yang saya tahu Anda selalu dapat menggunakan python2untuk menjalankannya (jika diinstal), dan selalu Anda dapat memeriksa versi dengan python -V. jika Anda ingin itu pythonmenjadi 2 atau 3, Anda harus rm /usr/bin/pythondan kemudian membuat symlink yang menunjuk dari versi python desierd Anda misalnya ln -s /usr/bin/python2.5 /usr/bin/python.
Hanan N.
Terima kasih telah memastikan saya python2. Saya bertanya-tanya mengapa itu tidak standar untuk menggunakannya ketika ada py2k dan py3k dan default pythondapat berbeda. Bagaimana dengan saran Anda tentang menghapus - ini tidak sesuai dengan contoh ini, karena saya bertanya tentang pengemasan. Saya ingin membuat paket yang dapat berjalan di berbagai konfigurasi / sistem. Tidak ada cara untuk memodifikasi lingkungan. Bagaimana dengan pengecekan - itu tidak berlaku untuk Shebang - sejauh yang saya tahu.
Grzegorz Wierzowiecki
Saya percaya apa yang @Hanan N. coba katakan kepada Anda adalah bahwa jika Anda menulis kode Python 2.x, maka gunakan #!...python2dalam program Anda dan jika Anda menggunakan Python 3.x, maka gunakan #!...python3. Jangan mengandalkan sistem operasi untuk memiliki tautan yang tepat jika Anda tahu itu hanya akan bekerja pada rilis tertentu. Saya bekerja dengan sistem yang masih memiliki Python 1.5.2 diinstal sebagai /usr/bin/python- Saya baik menulis kode untuk menangani rilis Python yang lebih lama atau menggunakan python2.
Arcege
2
@Arcege Saya tidak memiliki python2file executable di sistem saya (Debian squeeze). pythonadalah symlink ke python2.6, dan python3adalah symlink ke python3.1, tetapi tidak ada python2.
Gilles 'SO- stop being evil'

Jawaban:

3

Sebuah skrip dapat memeriksa versi Python-nya dan, jika itu Python 3, mulai kembali menggunakan Python 2. Tambahkan yang berikut di dekat kepala skrip:

if sys.version > '3':
  python2 = os.popen('which python2 2> /dev/null').read().rstrip()
  if python2:
    args = sys.argv[:]
    args.insert(0,python2)
    os.execv(python2,args)
  else:
    sys.exit("%s requires Python Version 2 (python2 not in PATH)" % os.path.basename(__file__))

Ini menggunakan perintah sistem whichuntuk mencari python2di lingkungan PATH. Kemudian diluncurkan kembali dengan itu (atau dibatalkan jika tidak dapat menemukannya).

Perhatikan bahwa skrip memang perlu sintaksis Python 3 yang valid agar skrip itu dimulai dalam Python 3.

Juga, output apa pun harus disiram sebelum execvpanggilan atau itu akan hilang. Menambahkan, misalnya, sys.stdout.flush()tepat sebelum panggilan ke execvakan menyiram printpernyataan apa pun .

starfry
sumber
1

Pada versi yang lebih lama, mungkin pythonmalah ada python2. Untuk membuat garis sheebang Anda lebih jelas, Anda bisa membuat tautan python2 -> pythonsehingga Anda bisa menggunakannya #!/usr/bin/env python2.

DocSalvager
sumber
Namun, itu tidak menyelesaikan masalah yang disebutkan. Karena pertanyaannya adalah bagaimana membuat skrip Anda cukup portabel, sehingga dapat berjalan di semua lingkungan yang disebutkan (dengan "python" "python2" dll)
Grzegorz Wierzowiecki
1

Saya pikir "standar" didefinisikan dalam https://www.python.org/dev/peps/pep-0394/

PEP ini menyediakan konvensi untuk memastikan bahwa skrip Python dapat terus portabel di seluruh sistem * nix, terlepas dari versi default interpreter Python (yaitu versi yang dipanggil oleh perintah python).

  • python2 akan merujuk ke beberapa versi Python 2.x.
  • python3 akan merujuk ke beberapa versi Python 3.x.
  • untuk saat ini, semua distribusi harus memastikan bahwa python merujuk ke target yang sama dengan python2.
  • namun, pengguna akhir harus menyadari bahwa python merujuk ke python3 pada setidaknya Arch Linux (perubahan itulah yang mendorong pembuatan PEP ini), jadi python harus digunakan pada baris shebang hanya untuk skrip yang sumbernya kompatibel dengan kedua Python 2 dan 3.
  • sebagai persiapan untuk perubahan akhirnya pada versi standar Python, hanya skrip Python 2 yang harus diperbarui menjadi sumber yang kompatibel dengan Python 3 atau yang lain untuk menggunakan python2 di baris shebang.
StrongBad
sumber