Saya mencoba untuk membuat lingkungan python terpisah dari sistem satu (menggunakan virtualenv) dalam direktori yang tidak di bawah / rumah, karena saya perlu menggunakannya untuk membangun perangkat lunak lain yang harus dapat diakses oleh banyak pengguna. Saya dapat membuat dan mengaktifkan virtualenv baik-baik saja, tetapi ketika saya sudo
beberapa perintah (misalnya untuk membuat atau mengkompilasi perangkat lunak lain), itu adalah sistem python yang digunakan (saya bisa tahu karena modul yang tersedia).
Karena di Ubuntu itu bukan hal yang baik untuk menggunakan pengguna root , apakah ada cara untuk mengatakan sudo
untuk menggunakan virtualenv? Atau mungkin ini bukan pendekatan yang benar, dan saya harus membuat instalasi python yang sama sekali baru?
Saya menggunakan versi 64bit dari Ubuntu 12.04 (dan python 2.7).
Jawaban:
Masalahnya hampir pasti bahwa ketika Anda menjalankan
sudo
, variabel lingkungan virtualenv, alias, fungsi, dll tidak terbawa.Solusinya adalah dengan secara eksplisit menjalankan Python executable dengan lingkungan virtual
sudo
. Misalnya jika virtualenv Anda adalah ./AwesomeProject, maka Anda dapat menjalankansudo ./AwesomeProject/bin/python <script>
untuk menggunakan skrip dengan virtualenv dengan hak akses root.sumber
#!<virtualenv_dir>/bin/python
.Hanya menemukan ini dan untuk orang lain yang mungkin menemukan masalah yang sama, Ken benar bahwa variabel env tidak sedang dibawa. Solusi yang saya gunakan adalah menambahkan baris berikut ke skrip saya. Ini memiliki manfaat tambahan untuk selalu memuat lingkungan virtual langsung dari skrip. (Artinya Anda dapat menggunakan skrip dengan crontab atau launchd tanpa ada solusi lain.)
Lebih banyak latar belakang di sini: https://virtualenv.pypa.io/en/latest/userguide.html#using-virtualenv-without-bin-python
sumber
Terkadang Anda memerlukan $ PATH yang diperbarui karena skrip menjalankan program lain. Misalnya pypi-install perlu py2dsc-deb di PATH. Perintah ini berfungsi:
sudo sh -c ". venv/bin/activate ; pypi-install $PACKAGE"
sumber