Làm thế nào để sử dụng một ảo python với sudo?


47

Tôi đang cố gắng tạo một môi trường python tách biệt với môi trường (sử dụng virtualenv) trong một thư mục không nằm trong / home, vì tôi cần sử dụng nó để xây dựng phần mềm khác mà nhiều người dùng có thể truy cập được. Tôi có thể tạo và kích hoạt virtualenv, nhưng khi tôi thực hiện sudomột số lệnh (ví dụ để tạo hoặc biên dịch phần mềm khác), đó là python hệ thống được sử dụng (tôi có thể biết vì các mô-đun có sẵn).

Vì trên Ubuntu không phải là một điều tốt để sử dụng người dùng root , có cách nào để nói sudosử dụng virtualenv không? Hoặc có thể đây không phải là cách tiếp cận chính xác và tôi nên thực hiện cài đặt python hoàn toàn mới?

Tôi đang sử dụng phiên bản 64 bit của Ubuntu 12.04 (và python 2.7).


1
Liệu sau đây làm việc? sudo $ (mà trăn) <script>
John Drinane

Câu trả lời:


57

Vấn đề gần như chắc chắn là khi bạn chạy sudo, các biến môi trường virtualenv, bí danh, hàm, v.v. sẽ không được thực hiện.

Giải pháp sẽ là chạy Python thực thi với môi trường ảo sudo. Ví dụ: nếu virtualenv của bạn là ./AwgieProject, thì bạn có thể chạy sudo ./AwesomeProject/bin/python <script>để sử dụng tập lệnh với virtualenv với quyền root.


3
Bạn cũng có thể để dòng đầu tiên của tập lệnh trỏ đến tệp nhị phân Python trong virtualenv của bạn. #!<virtualenv_dir>/bin/python.
OrangeTux

Ugh, khó chịu rằng đây chỉ là giải pháp. Trên Mac, sudo python sử dụng python từ env ảo.
gaefan

4

Chỉ tình cờ gặp vấn đề này và đối với những người khác có thể tìm thấy vấn đề tương tự, Ken chính xác rằng các biến env không được chuyển sang. Giải pháp tôi đã sử dụng là thêm các dòng sau vào tập lệnh của mình. Điều này có thêm lợi ích là luôn tải môi trường ảo trực tiếp từ tập lệnh. (Có nghĩa là bạn có thể sử dụng tập lệnh với crontab hoặc launchd mà không cần bất kỳ cách giải quyết nào khác.)

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

Thêm thông tin tại đây: https://virtualenv.pypa.io/en/latest/userguide.html#USE-virtualenv-without-bin-python


4

Đôi khi bạn cần cập nhật $ PATH vì tập lệnh chạy các chương trình khác. Ví dụ: cài đặt pypi cần py2dsc-deb trong PATH. Lệnh này hoạt động:sudo sh -c ". venv/bin/activate ; pypi-install $PACKAGE"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.