Haruskah saya menaruh shebang di skrip Python saya? Dalam bentuk apa?
#!/usr/bin/env python
atau
#!/usr/local/bin/python
Apakah ini sama-sama portabel? Bentuk mana yang paling banyak digunakan?
Catatan: yang tornado proyek menggunakan peristiwa tersebut. Di sisi lainproyek Django tidak.
python
shell
python-3.x
shebang
treecoder
sumber
sumber
#!/usr/bin/python
dibandingkan dengan opsi pertama? Saya melihat ini dalam banyak contoh kode. Sunting: Mungkin ini jawabannya .. stackoverflow.com/a/2429517/1156245Jawaban:
Baris shebang dalam skrip apa pun menentukan kemampuan skrip untuk dieksekusi seperti yang dapat dieksekusi mandiri tanpa mengetikkan
python
sebelumnya di terminal atau ketika mengklik dua kali dalam file manager (bila dikonfigurasi dengan benar). Tidak perlu tetapi umumnya diletakkan di sana sehingga ketika seseorang melihat file dibuka di editor, mereka segera tahu apa yang mereka lihat Namun, garis shebang mana yang Anda gunakan IS penting.Penggunaan yang benar untuk skrip Python 3 adalah:
Ini default ke versi 3. terbaru. Untuk Python 2.7.estest digunakan
python2
sebagai penggantipython3
.Berikut ini TIDAK boleh digunakan (kecuali untuk kasus yang jarang Anda menulis kode yang kompatibel dengan Python 2.x dan 3.x):
Alasan untuk rekomendasi ini, diberikan dalam PEP 394 , adalah yang
python
dapat merujuk kepython2
ataupython3
pada sistem yang berbeda. Saat ini mengacupython2
pada sebagian besar distribusi, tetapi itu mungkin akan berubah di beberapa titik.Juga, JANGAN Gunakan:
- "#! / usr / bin / env python" vs "#! / usr / local / bin / python"
sumber
/usr/bin
maka bagaimana Anda dapat yakin bahwaenv
akan ditemukan/usr/bin
. Jika python dipasang di tempat non-standar maka kemungkinan itu berarti bahwa python diatur dengan cara non-standar dan sebagai hasilnya skrip harus gagal dengan cepat. Berbeda dengan membuat asumsi tentang sifat-sifat interpreter python dan berharap yang terbaik.env
akan selalu ditemukan di/usr/bin/
, dan tugasnya adalah untuk menemukan tempat sampah (seperti python) menggunakanPATH
. Tidak peduli bagaimana python diinstal, pathnya akan ditambahkan ke variabel ini, danenv
akan menemukannya (jika tidak, python tidak diinstal). Itu pekerjaanenv
, itulah alasan mengapa itu ada. Ini adalah hal yang memperingatkan lingkungan (mengatur variabel env, termasuk jalur instal, dan menyertakan jalur). Orang-orang selalu mengerti bahwa perintah ini hanya dapat berfungsi jika selalu ditemukan di tempat yang sama. Itu hanya diberikan/usr/bin/env
tidak dijamin oleh standar apa pun, selain aturan yang diadopsi secara luas (universal?) ...python
executable ketika skrip kompatibel dengan Python 2 dan Python 3. Jika tidak, itu harus menunjuk ke pilihan yang sesuai daripython2
danpython3
.Ini benar-benar hanya masalah selera. Menambahkan shebang berarti orang dapat menjalankan skrip secara langsung jika mereka mau (dengan asumsi itu ditandai sebagai executable); menghilangkannya berarti
python
harus dipanggil secara manual.Hasil akhir dari menjalankan program tidak terpengaruh; itu hanya pilihan sarana.
sumber
chmod a+x [your-script].py
harus membuatnya dapat dieksekusi dan kemudian Anda bisa memanggil./[your-script.py]
shell.Masukkan shebang ke dalam skrip Python untuk menunjukkan:
python
executable secara eksplisitJika Anda menulis shebang secara manual maka selalu gunakan
#!/usr/bin/env python
kecuali Anda memiliki alasan khusus untuk tidak menggunakannya. Formulir ini dipahami bahkan di Windows (peluncur Python).Catatan: skrip yang terinstal harus menggunakan python yang dapat dieksekusi misalnya,
/usr/bin/python
atau/home/me/.virtualenvs/project/bin/python
. Ini buruk jika beberapa alat rusak jika Anda mengaktifkan virtualenv di shell Anda. Untungnya, shebang yang benar dibuat secara otomatis dalam banyak kasus olehsetuptools
atau alat paket distribusi Anda (pada Windows,setuptools
dapat menghasilkan.exe
skrip wrapper secara otomatis).Dengan kata lain, jika skrip berada di sumber checkout maka Anda mungkin akan melihat
#!/usr/bin/env python
. Jika sudah diinstal maka shebang adalah path ke executable python tertentu seperti#!/usr/local/bin/python
(CATATAN: Anda seharusnya tidak menulis path dari kategori terakhir secara manual).Untuk memilih apakah Anda harus menggunakan
python
,,python2
ataupython3
di shebang, lihat PEP 394 - Perintah "python" pada Sistem Unix-Like :sumber
#!/usr/bin/env python
dirinya sendiri?#!/usr/bin/env python
. Tolong jangan menyarankan untuk "selalu menggunakan"#!/usr/bin/env python
. Ini adalah hal yang salah untuk dilakukan dalam 99% kasus (alasan yang Anda masukkan dalam jawaban Anda).Jika Anda memiliki lebih dari satu versi Python dan skrip perlu dijalankan di bawah versi tertentu, she-bang dapat memastikan yang tepat digunakan ketika skrip dieksekusi secara langsung, misalnya:
Catatan skrip masih bisa dijalankan melalui baris perintah Python lengkap, atau melalui impor, dalam hal ini she-bang diabaikan. Tetapi untuk skrip yang dijalankan secara langsung, ini adalah alasan yang layak untuk menggunakan she-bang.
#!/usr/bin/env python
pada umumnya pendekatan yang lebih baik, tetapi ini membantu dengan kasus-kasus khusus.Biasanya akan lebih baik untuk membuat lingkungan virtual Python, dalam hal ini generik
#!/usr/bin/env python
akan mengidentifikasi contoh Python yang benar untuk virtualenv.sumber
which
akan memberi Anda string yang akan bekerja, titik. Anda tidak perlu khawatir tentang nyali apa pun untuk menggunakannya.Anda harus menambahkan shebang jika skrip ini dimaksudkan untuk dieksekusi. Anda juga harus menginstal skrip dengan perangkat lunak penginstalan yang memodifikasi shebang ke sesuatu yang benar sehingga akan bekerja pada platform target. Contohnya adalah distutils dan Distribute.
sumber
which
akan secara otomatis memilih default yang sedang digunakan oleh perintah sistem dan semacamnya. Ini generik dan sistem mengarahkannya ke instalasi yang tepat.Tujuan dari shebang adalah agar skrip mengenali tipe juru bahasa saat Anda ingin menjalankan skrip dari shell. Sebagian besar, dan tidak selalu, Anda menjalankan skrip dengan memasok penerjemah secara eksternal. Contoh penggunaan:
python-x.x script.py
Ini akan berfungsi bahkan jika Anda tidak memiliki deklarator shebang.
Mengapa yang pertama lebih "portabel" karena,
/usr/bin/env
berisiPATH
deklarasi Anda yang menyumbang semua tujuan di mana executable sistem Anda berada.CATATAN: Tornado tidak sepenuhnya menggunakan shebang, dan Django tidak menggunakan ini. Ini berbeda dengan bagaimana Anda menjalankan fungsi utama aplikasi Anda.
JUGA: Tidak berbeda dengan Python.
sumber
Kadang-kadang, jika jawabannya sangat tidak jelas (Maksudku Anda tidak dapat memutuskan apakah ya atau tidak), maka tidak peduli terlalu banyak, dan Anda dapat mengabaikan masalah sampai jawabannya adalah jelas.
Satu-
#!
satunya tujuan adalah untuk meluncurkan skrip. Django memuat sumbernya sendiri dan menggunakannya. Tidak perlu memutuskan juru bahasa apa yang harus digunakan. Dengan cara ini,#!
sebenarnya tidak masuk akal di sini.Secara umum, jika itu adalah modul dan tidak dapat digunakan sebagai skrip, tidak perlu menggunakan
#!
. Di sisi lain, sumber modul sering mengandungif __name__ == '__main__': ...
setidaknya beberapa pengujian fungsionalitas yang sepele. Kemudian#!
masuk akal lagi.Salah satu alasan bagus untuk menggunakan
#!
adalah ketika Anda menggunakan skrip Python 2 dan Python 3 - mereka harus ditafsirkan oleh versi Python yang berbeda. Dengan cara ini, Anda harus mengingat apa yangpython
harus digunakan ketika meluncurkan skrip secara manual (tanpa bagian#!
dalam). Jika Anda memiliki campuran skrip-skrip seperti itu, sebaiknya gunakan bagian#!
dalamnya, buat agar dapat dieksekusi, dan luncurkan sebagai skrip yang dapat dieksekusi (chmod ...).Saat menggunakan MS-Windows,
#!
tidak masuk akal - sampai saat ini. Python 3.3 memperkenalkan Windows Python Launcher (py.exe dan pyw.exe) yang bertuliskan#!
baris, mendeteksi versi Python yang diinstal, dan menggunakan versi Python yang benar atau dicari secara eksplisit. Karena ekstensi dapat dikaitkan dengan program, Anda bisa mendapatkan perilaku serupa di Windows seperti halnya menjalankan flag di sistem berbasis Unix.sumber
Ketika saya menginstal Python 3.6.1 pada Windows 7 baru-baru ini, ia juga menginstal Python Launcher untuk Windows, yang seharusnya menangani garis shebang. Namun, saya menemukan bahwa Peluncur Python tidak melakukan ini: baris shebang diabaikan dan Python 2.7.13 selalu digunakan (kecuali saya mengeksekusi skrip menggunakan py -3).
Untuk memperbaikinya, saya harus mengedit kunci registri Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\command
. Ini masih memiliki nilaidari instalasi Python 2.7 saya sebelumnya. Saya mengubah nilai kunci registri ini menjadi
dan pemrosesan baris shebang Python Launcher berfungsi seperti dijelaskan di atas.
sumber
Jika Anda memiliki modul yang berbeda diinstal dan perlu menggunakan instalasi python tertentu, maka shebang tampaknya terbatas pada awalnya. Namun, Anda dapat melakukan trik seperti di bawah ini untuk memungkinkan shebang dipanggil terlebih dahulu sebagai skrip shell dan kemudian pilih python. Ini imo sangat fleksibel:
Atau lebih baik lagi, mungkin, untuk memfasilitasi penggunaan kembali kode di banyak skrip python:
dan kemudian select.sh memiliki:
sumber
Jawab: Hanya jika Anda berencana menjadikannya skrip yang dapat dieksekusi command-line.
Inilah prosedurnya:
Mulailah dengan memverifikasi string shebang yang tepat untuk digunakan:
Ambil output dari itu dan tambahkan (dengan shebang #!) Di baris pertama.
Di sistem saya merespons seperti ini:
Jadi shebang Anda akan terlihat seperti:
Setelah menyimpan, itu akan tetap berjalan seperti sebelumnya karena python akan melihat baris pertama sebagai komentar.
Untuk membuatnya menjadi perintah, salinlah untuk menjatuhkan ekstensi .py.
Beri tahu sistem file bahwa ini akan dapat dieksekusi:
Untuk mengujinya, gunakan:
Praktik terbaik adalah memindahkannya di suatu tempat di $ PATH Anda sehingga yang perlu Anda ketikkan adalah nama file itu sendiri.
Dengan begitu ia akan bekerja di mana saja (tanpa ./ sebelum nama file)
sumber
Absolute vs Logical Path:
Ini benar-benar sebuah pertanyaan tentang apakah jalur ke juru bahasa Python harus mutlak atau logis (
/usr/bin/env
) sehubungan dengan portabilitas.Mengetahui jawaban lain tentang hal ini dan situs Stack lain yang membahas masalah ini secara umum tanpa bukti pendukung, saya telah melakukan beberapa pengujian & analisis granular yang BENAR-BENAR untuk pertanyaan ini di unix.stackexchange.com . Daripada menempelkan jawaban itu di sini, saya akan mengarahkan mereka yang tertarik pada analisis komparatif untuk jawaban itu:
https://unix.stackexchange.com/a/566019/334294
Menjadi seorang Insinyur Linux, tujuan saya adalah selalu menyediakan host yang paling optimal dan dioptimalkan untuk klien pengembang saya, jadi masalah lingkungan Python adalah sesuatu yang saya benar-benar membutuhkan jawaban yang solid. Pandangan saya setelah pengujian adalah bahwa jalur logis dalam she-bang adalah yang lebih baik dari opsi (2).
sumber
Gunakan dulu
Ini akan memberikan output sebagai lokasi di mana penerjemah python saya (biner) hadir.
Output ini bisa berupa
atau
Sekarang dengan tepat pilih garis shebang dan gunakan itu.
Untuk menggeneralisasi kita dapat menggunakan:
atau
sumber
#!/usr/bin/env
membuat pilihan yang tepat untuk Anda.which
perintah - itu akan mengembalikan string yang benar untuk sistem khusus Anda.which python
lagi dan mengubah skrip jika output berbeda dari shebang saat ini