Saya menggunakan MacOSX bash
sebagai shell saya. Saya memiliki tautan simbolis, dibuat seperti ini:
ln -s /usr/bin/python python2
Saya memiliki paket yang menggunakan python2 dan saya ingin membuat tautan simbol di direktori kerja saya saat ini /usr/bin/python
yang sebenarnya adalah python2. Ketika saya melakukan python2
dari baris perintah saya mendapatkan kesalahan ini:
python2: realpath couldn't resolve "/usr/bin/python2"
Tetapi menjalankannya seperti ini akan ./python2
menyelesaikan jalur dengan benar. Saya PATH
memiliki .
di dalamnya. Bahkan saya memodifikasinya, untuk pengujian, hanya ada .
di dalamnya.
Bagaimana saya mengatasi ini? Terima kasih!
Konteks
Sejumlah solusi yang disarankan di bawah ini tidak akan berfungsi untuk saya. Saya mencoba menyaring pertanyaan saya dengan fokus dan sesingkat mungkin sehingga orang tidak akan tenggelam dalam lautan teks, tetapi jelas saya perlu memberikan lebih banyak latar belakang.
Saya mencoba mengembangkan paket yang saya kloning dari git. Paket asli git-multimail
,, adalah / dikembangkan pada beberapa varian Linux (saya rasa Ubuntu). Saya sudah mencoba memodifikasinya untuk dapat menggunakannya dan test suite-nya di MacOSX dengan sesedikit mungkin modifikasi. Inilah mengapa beberapa solusi yang diusulkan tidak ideal:
Sebagai root, buat
python2
symlink di / usr / bin /. Saya mencari solusi yang tidak memerlukan ini. Ini adalah pilihan yang jelas di awal, tetapi saya ingin solusi yang memodifikasi sistem host sesedikit mungkin. Inilah sebabnya saya ingin membuat symlink sementara di direktori kerja saat ini, menambahkan CWD (ie.
) ke path saya, dan kemudian menghancurkan ini ketika selesai (yaitu symlink).Buat skrip wrapper untuk memanggil skrip python dengan python yang ada. Masalah dengan ini adalah bahwa banyak dari test suite menggunakan script_files yang sebenarnya sebagai executable, tergantung pada shebang untuk menemukan lingkungan eksekusi yang benar. Ini berarti mengedit test suite secara signifikan. Dalam konteks ini, (lihat di bawah untuk potongan kerangka uji), saya harus menambahkan pembungkus untuk setiap
.py
file; lebih lanjut pengguna / pengembang harus menyadari aturan yang berbeda untuk menggunakan paket tergantung pada sistem mereka (yaitu pada MacOSX pastikan Anda tidak menggunakan file python tanpa memohonnya melalui pembungkus atau secara eksplisit memanggil/usr/bin/python file.py
).#! /bin/sh D=$(cd $(dirname "$0") && pwd) MULTIMAIL="$D/../git-multimail/git_multimail.py" POST_RECEIVE="$D/../git-multimail/post-receive" TESTREPO=$("$D/create-test-repo") HOME="$D" XDG_CONFIG_HOME="$D" GIT_CONFIG_NOSYSTEM=1 export HOME XDG_CONFIG_HOME GIT_CONFIG_NOSYSTEM cd $TESTREPO test_email() { REFNAME="$1" OLDREV="$2" NEWREV="$3" echo "$OLDREV" "$NEWREV" "$REFNAME" | USER=pushuser "$MULTIMAIL" }
Mengubah semua
python2
referensi kepython
. README menyarankan ini, tetapi ini secara efektif membuat kontrol versi tidak berguna karena sistem melihat perubahan sebagai versi baru, padahal sebenarnya tidak (semantik).
Saya telah menggunakan (3) tetapi saya mencoba mencari solusi yang lebih baik. Saya bersedia menerima bahwa ini memang keadaannya semula (yaitu tidak ada cara yang cocok untuk menunjukkan 'python2' ke /usr/bin/python
yang portabel dan tidak mencolok tanpa banyak perubahan pada test suite dan kerangka kerja sebenarnya).
git-multimail.py
itu #!/usr/bin/env python2
, jadi ada cara (relatif) langsung untuk melakukan ini.
ln -s /usr/bin/python2.7 /usr/local/bin/python2
berhasil
ln -s /usr/bin/python /usr/bin/python2