2011-09-10 6 views
34

tôi đã cố gắng kích hoạt một virtualenv thông qua một kịch bản shell như hình dưới đây nhưng nó dường như không làm việc,Kích hoạt một virtualenv sử dụng một kịch bản shell dường như không làm việc

#!/bin/sh 
source ~/.virtualenvs/pinax-env/bin/activate 

tôi nhận được lỗi sau

$ sh virtualenv_activate.sh 
virtualenv_activate.sh: 2: source: not found 

nhưng nếu tôi nhập lệnh như vậy trên thiết bị đầu cuối có vẻ như để làm việc

$ source ~/.virtualenvs/pinax-env/bin/activate 
(pinax-env)[email protected]:$ 

Vì vậy, tôi đã thay đổi shell script để

#!/bin/bash 
source ~/.virtualenvs/pinax-env/bin/activate 

như đề xuất và sử dụng

$ bash virtualenv_activate.sh 
[email protected]:$ 

để chạy các kịch bản.

Điều đó không gây ra lỗi nhưng điều đó cũng không kích hoạt ảo env

Vì vậy, bất kỳ đề xuất nào về cách giải quyết vấn đề này?

PS: Tôi đang sử dụng Ubuntu 11.04

+1

thử 'bash virtualenv_activate.sh' – arunkumar

+1

bạn có thể vui lòng xây dựng và đăng câu trả lời đó không. – Gautam

Trả lời

39

sh là không giống như bash (mặc dù một số hệ thống chỉ cần liên kết sh để bash, vì vậy chạy sh thực sự chạy bash). Bạn có thể nghĩ sh như một phiên bản bash. Một điều mà bash có sh đó không phải là "nguồn" lệnh. Đây là lý do tại sao bạn nhận được lỗi đó ... nguồn chạy tốt trong bash shell của bạn. Nhưng khi bạn bắt đầu kịch bản của bạn bằng cách sử dụng sh, bạn chạy kịch bản trong một trình bao trong một tiến trình con. Kể từ khi kịch bản đó đang chạy trong sh, "nguồn" không được tìm thấy.

Giải pháp là chạy tập lệnh bằng bash thay thế. Thay đổi dòng đầu tiên để ...

#!/bin/bash 

Sau đó chạy với ...

./virtualenv_activate.sh 

... hoặc ...

/bin/bash virtualenv_activate.sh 

Edit:

Nếu bạn muốn kích hoạt virtualenv để thay đổi shell mà bạn gọi script, bạn cần sử dụng toán tử "nguồn" hoặc "dấu chấm". Điều này đảm bảo rằng kịch bản được chạy trong vỏ hiện tại (và do đó làm thay đổi môi trường hiện tại) ...

source virtualenv_activate.sh 

... hoặc ...

. virtualenv_activate.sh 

Như một mặt lưu ý, đây là tại sao virtualenv luôn nói rằng bạn cần sử dụng "source" để chạy script kích hoạt của nó.  

+1

hoặc sử dụng tương đương shell được sinh ra từ nguồn, tức là '. envFile', thường được gọi là 'chấm envFile'. Chúc may mắn ;-) – shellter

+1

Cảm ơn nhưng điều đó dường như không giải quyết vấn đề, Khi tôi sử dụng bash nó không ném một lỗi nhưng nó cũng không kích hoạt virtualenv. Bạn có thể vui lòng xây dựng trên .envFile – Gautam

+5

Khi bạn chạy các tập lệnh này theo cách tôi đã hiển thị, nó thực sự tạo một vỏ MỚI và chạy tập lệnh trong trình bao đó. Vì toàn bộ điểm của kịch bản "nguồn" là thay đổi trình bao hiện tại, điều này sẽ đánh bại mục đích. Chạy tập lệnh của bạn bằng cách sử dụng "source virtualenv_activate.sh" hoặc ". Virtualenv_activate.sh" (chú ý không gian sau khoảng thời gian đầu tiên đó). –

3

source là lệnh trình bao tích hợp trong bash và không có sẵn trong sh. Nếu tôi nhớ chính xác thì virtual env thực hiện rất nhiều thao tác biến môi trường và đường dẫn. Thậm chí chạy nó như bash virtualenv_blah.sh sẽ không hoạt động vì điều này sẽ chỉ đơn giản là tạo ra môi trường bên trong sub-shell.

Hãy thử . virtualenv_activate.sh hoặc source virtualenv_activate.sh điều này về cơ bản sẽ chạy tập lệnh trong môi trường hiện tại của bạn và tất cả biến môi trường được sửa đổi bởi kích hoạt của virtualenv sẽ khả dụng.

HTH.

Edit: Đây là một liên kết có thể giúp - http://ss64.com/bash/period.html

4

Trên Mac OS X đề nghị của bạn dường như không làm việc.

Tôi đã thực hiện theo cách này. I'am không phải là rất hài lòng với giải pháp, nhưng chia sẻ nó anyway đây và hy vọng, rằng có lẽ ai đó sẽ đề xuất tốt hơn một:

Trong activate.sh Tôi có

echo 'source /Users/andi/.virtualenvs/data_science/bin/activate' 

tôi cho phép thực hiện bởi: chmod +x activate.sh

Và tôi thực hiện theo cách này:

`./activate.sh` 

Chú ý rằng có ngoặc ở dạng mã ASCII 96 = `(Grav e accent)