Bergantung pada sistem, python
== python2
atau 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 python2
file, jadi #!/usr/bin/env python2
akan berfungsi?
Jika ya, mengapa tidak diusulkan sebagai standar, misalnya dalam dokumentasi python py2k ?
sumber
python2
untuk menjalankannya (jika diinstal), dan selalu Anda dapat memeriksa versi denganpython -V
. jika Anda ingin itupython
menjadi 2 atau 3, Anda harusrm /usr/bin/python
dan kemudian membuat symlink yang menunjuk dari versi python desierd Anda misalnyaln -s /usr/bin/python2.5 /usr/bin/python
.python2
. Saya bertanya-tanya mengapa itu tidak standar untuk menggunakannya ketika ada py2k dan py3k dan defaultpython
dapat 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.#!...python2
dalam 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 menggunakanpython2
.python2
file executable di sistem saya (Debian squeeze).python
adalah symlink kepython2.6
, danpython3
adalah symlink kepython3.1
, tetapi tidak adapython2
.Jawaban:
Sebuah skrip dapat memeriksa versi Python-nya dan, jika itu Python 3, mulai kembali menggunakan Python 2. Tambahkan yang berikut di dekat kepala skrip:
Ini menggunakan perintah sistem
which
untuk mencaripython2
di lingkunganPATH
. 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
execv
panggilan atau itu akan hilang. Menambahkan, misalnya,sys.stdout.flush()
tepat sebelum panggilan keexecv
akan menyiramprint
pernyataan apa pun .sumber
Pada versi yang lebih lama, mungkin
python
malah adapython2
. Untuk membuat garis sheebang Anda lebih jelas, Anda bisa membuat tautanpython2 -> python
sehingga Anda bisa menggunakannya#!/usr/bin/env python2
.sumber
Saya pikir "standar" didefinisikan dalam https://www.python.org/dev/peps/pep-0394/
sumber