Bagaimana cara menggunakan python virtualenv dengan sudo?

47

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 sudobeberapa 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 sudountuk 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).

Marco P.
sumber
1
Apakah yang berikut ini berhasil? sudo $ (yang python) <script>
John Drinane

Jawaban:

57

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 menjalankan sudo ./AwesomeProject/bin/python <script>untuk menggunakan skrip dengan virtualenv dengan hak akses root.

Ken Kinder
sumber
3
Anda juga bisa membiarkan baris pertama dari skrip Anda mengarah ke biner Python di virtualenv Anda. #!<virtualenv_dir>/bin/python.
OrangeTux
Ugh, menyebalkan bahwa ini hanya solusi sejauh ini. Di Mac, sudo python menggunakan python dari virtual env.
gaefan
4

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.)

base_dir = os.path.dirname(os.path.abspath(__file__))
activate_this = os.path.join(base_dir, 'venv/bin/activate_this.py')
execfile(activate_this, dict(__file__=activate_this))

Lebih banyak latar belakang di sini: https://virtualenv.pypa.io/en/latest/userguide.html#using-virtualenv-without-bin-python

corey_s
sumber
4

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"

steveayre
sumber