2011-09-24 37 views
49

Vì vậy, một lần nữa, tôi tạo một chương trình python đẹp giúp cuộc sống của tôi trở nên dễ dàng hơn và tiết kiệm rất nhiều thời gian. Ofcourse, điều này liên quan đến một virtualenv, được thực hiện với các chức năng mkvirtualenv của virtualenvwrapper. Dự án có một tập tin requirements.txt với một vài thư viện cần thiết (yêu cầu quá: D) và chương trình sẽ không chạy nếu không có các thư viện này.chức năng virtualenvwrapper không có trong kịch bản shell

Tôi đang cố thêm tập lệnh shell thực thi bin/run-app sẽ nằm trong đường dẫn của tôi (liên kết tượng trưng thực sự). Bây giờ, bên trong kịch bản này, tôi cần phải chuyển sang virtualenv trước khi tôi có thể chạy chương trình này. Vì vậy, tôi đặt điều này trong

#!/bin/bash 
# cd into the project directory 
workon "$(cat .venv)" 
python main.py 

Một tệp .venv chứa tên virtualenv. Nhưng khi tôi chạy tập lệnh này, tôi gặp lỗi workon: command not found.

Tất nhiên, tôi có virtualenvwrapper.sh có nguồn gốc trong bashrc của tôi nhưng nó dường như không có sẵn trong tập lệnh shell này.

Vì vậy, làm cách nào tôi có thể truy cập các chức năng virtualenvwrapper ở đây? Hoặc tôi đang làm điều này một cách sai lầm? Làm thế nào để bạn khởi động các công cụ python của bạn, mỗi công cụ đều có virtualenv riêng của nó !?

Trả lời

57

Chỉ cần nguồn kịch bản virtualenvwrapper.sh trong tập lệnh của bạn để nhập các chức năng của virtualenvwrapper. Sau đó, bạn có thể sử dụng chức năng workon trong tập lệnh của mình.

Và có lẽ tốt hơn, bạn có thể tạo ra một kịch bản shell (bạn có thể đặt tên cho nó venv-run.sh ví dụ) để chạy bất kỳ kịch bản Python vào một virtualenv nhất định, và đặt nó trong /usr/bin, /usr/local/bin, hoặc bất kỳ thư mục mà là ở PATH của bạn.

một kịch bản như vậy có thể trông như thế này:

#!/bin/sh 
# if virtualenvwrapper.sh is in your PATH (i.e. installed with pip) 
source `which virtualenvwrapper.sh` 
#source /path/to/virtualenvwrapper.sh # if it's not in your PATH 
workon $1 
python $2 
deactivate 

Và có thể được sử dụng đơn giản như venv-run.sh my_virtualenv /path/to/script.py

+2

Điều này yêu cầu vị trí mã hóa của vị trí của virtualenvwrapper.sh, vốn phụ thuộc vào hệ điều hành, trong số nhiều thứ khác. –

+0

@ShrikantSharat tốt, vì điều này có nghĩa là chỉ là một cách dễ dàng hơn cho bạn để chạy các kịch bản trong một virtualenv (vì vậy chỉ trên hệ thống của bạn), nó không thực sự là một vấn đề, phải không? Nếu bạn muốn phân phối mã của bạn, tôi nghi ngờ bạn sẽ yêu cầu người dùng cài đặt virtualenv và tạo một mã, bạn chỉ cần cung cấp cho anh ta một danh sách các phụ thuộc để cài đặt. – MatToufoutu

+0

* Người dùng * sẽ là những người bạn công nghệ của tôi, những người cũng muốn có virtualenv cho các phụ thuộc của chương trình này. Tôi không phải yêu cầu họ;) –

0

Nếu tập lệnh Python của bạn yêu cầu một virtualenv cụ thể, hãy đặt/cài đặt nó trong thư mục bin của virtualenv. Nếu bạn cần truy cập vào tập lệnh đó bên ngoài môi trường thì bạn có thể tạo một liên kết tượng trưng.

main.py từ virtualenv của bin:

#!/path/to/virtualenv/bin/python 
import yourmodule 

if __name__=="__main__": 
    yourmodule.main() 

liên kết mềm trong PATH của bạn:

pymain -> /path/to/virtualenv/bin/main.py 

Trong bin/chạy ứng dụng:

#!/bin/sh 
# cd into the project directory 
pymain arg1 arg2 ... 
+0

này hoạt động, nhưng tôi không thích cách đặt đường dẫn đến python virtualenv của trong #! dòng, cảm thấy một chút bẩn. Ngoài ra, bước bổ sung này trong việc tạo main.py * bên trong * virtualenv làm cho nó ít di động hơn. Bạn bè của tôi không thể chỉ sao chép và chạy nó từ tôi :) –

+0

@Shrikant Sharat: Nếu bạn viết setup.py đơn giản thì 'pip install' thực hiện cho bạn cả shebang và sao chép vào virtualenv/bin. Bạn bè của bạn chỉ có thể: 'pip install git + ...' nếu họ thích cạnh chảy máu. Lưu ý trong trường hợp này 'main.py' được sao chép vào * virtualenv và shebang của chúng được viết để trỏ tới * virtualenv/python của chúng. – jfs

+0

@Sebastian, Không bao giờ xem xét tùy chọn đó nhưng có vẻ tốt. Bất kỳ tài liệu đọc tốt trên đó bạn đề nghị (khác với tài liệu python mà tôi đang kiểm tra ngay bây giờ), nếu có. Cảm ơn! –

0

Rõ ràng, tôi đã làm điều này một cách sai lầm. Thay vì lưu tên của virtualenv trong tệp .venv, tôi nên đặt đường dẫn thư mục của virtualenv.

(cdvirtualenv && pwd) > .venv 

và trong bin/run-app, tôi đặt

source "$(cat .venv)/bin/activate" 
python main.py 

Và yay!

7

Tôi không thể tìm cách kích hoạt các lệnh của virtualenvwrapper trong trình bao.Nhưng thủ thuật này có thể giúp: giả sử env của bạn. tên là myenv, sau đó đưa dòng sau vào đầu script:

ENV=myenv 
source $WORKON_HOME/$ENV/bin/activate 
1

thêm những dòng này vào .bashrc hoặc .bash_profile

export WORKON_HOME=~/Envs 
source /usr/local/bin/virtualenvwrapper.sh 

và mở lại thiết bị đầu cuối của bạn và cố gắng

0

Bạn có thể cũng gọi trực tiếp tệp python của virtualenv. Đầu tiên tìm ra con đường để thực thi:

$ workon myenv 
$ which python 
/path/to/virtualenv/myenv/bin/python 

Sau đó gọi từ shell script của bạn:

#!/bin/bash 

/path/to/virtualenv/myenv/bin/python myscript.py 
0

Đó là một known issue. Là một khắc phục, bạn có thể làm cho nội dung của kịch bản một chức năng và đặt nó vào một trong hai ~/.bashrc hay ~/.profile

function run-app() { 
    workon "$(cat .venv)" 
    python main.py 
} 
Các vấn đề liên quan