2012-01-16 38 views
14

Đôi khi tôi gặp lỗi mà tôi nghi ngờ là kết quả của ứng dụng Django của tôi bằng cách sử dụng các mô-đun Python được cài đặt trên toàn cầu/ứng dụng Django thay vì các ứng dụng trong virtualenv của nó.Cách kiểm tra xem virtualenv đã được tạo bằng '--no-site-packages' chưa?

Có cách nào để kiểm tra xem virtualenv của ứng dụng của tôi đã được tạo bằng '--no-site-packages' mà không phải xóa nó, sau đó tạo lại nó như sau?

deactivate 
rmvirtualenv my_env 
mkvirtualenv my_env --no-site-packages 
workon my_env 
pip install -r requirements.txt 

Chắc chắn phải có cách nào tốt hơn! Cảm ơn.

Trả lời

21

Có một tập tin trong <env>/lib/pythonX.X/ gọi no-global-site-packages.txt khi bạn tạo ra một môi trường ảo với --no-site-packages.

Chỉ cần thử điều này với virtualenv 1.7:

% virtualenv --no-site-packages env.without 
% virtualenv --system-site-packages env.with 

% find env.without | sed 's/env.without//' > files.without 
% find env.with | sed 's/env.with//' > files.with 

% diff files.with* 
230a231 
> /lib/python3.2/no-global-site-packages.txt 
5

Cách dễ dàng là mở vỏ trăn tương tác và thực thi import somemodule; print somemodule rồi kiểm tra đường dẫn từ nơi mô-đun đó được nhập.

>>> import flask; print flask 
<module 'flask' from '/home/xxx/dev/xxx/env/lib/python2.7/site-packages/flask/__init__.pyc'> 

vs

>>> import flask; print flask 
<module 'flask' from '/usr/lib64/python2.7/site-packages/flask/__init__.pyc'> 
+0

Điều này chỉ hợp lệ nếu bạn có cùng một mô-đun được cài đặt trong cả hai nơi. Bạn không thể thực sự nhập cả hai cùng một lúc (trừ khi bạn thay đổi pythonpath) –

+0

Nếu không, bạn sẽ nhận được 'ImportError' - tùy thuộc vào nơi bạn nhận được nó, bạn biết rằng nó chỉ được cài đặt tại vị trí X. – ThiefMaster

+0

Đúng nếu bạn có mô-đun được cài đặt trong gói trang web. Nhưng sau đó bạn phải chọn một mô-đun mà bạn _know_ nó ở đó và trong thực tế kiểm tra cho 'ImportError' –

3

@ giải pháp Rob là hợp lệ cho phiên bản mới hơn, tôi đã nhìn vào mã :).

Nếu bạn có thẻ cũ (như 1.4.5), bạn có thể kiểm tra đường dẫn python. Nếu bạn có thư mục "gói trang web" mặc định trong đường dẫn (ví dụ:/usr/lib/python/site-packages), thì virtualenv của bạn đã được tạo với gói trang web.

Bạn có thể kiểm tra xem nó ra từ một cái gì đó như:

for p in sys.path: 
    if p.find("site-packages") >= 0: 
    print p 

Nếu bạn có --no-site-gói, tất cả các con đường của bạn sẽ như thế nào:

/home/user/virtualenv/myenv/lib/python2.6/site-packages/distribute-0.6.10-py2.6.egg 
/home/user/virtualenv/myenv/lib/python2.6/site-packages/pip-1.0.2-py2.6.egg 
/home/user/virtualenv/myenv/lib/python2.6/site-packages 

Nếu không, bạn sẽ có một cái gì đó như:

/home/user/virtualenv/myenv/lib/python2.6/site-packages/distribute-0.6.10-py2.6.egg 
/home/user/virtualenv/myenv/lib/python2.6/site-packages/pip-1.0.2-py2.6.egg 
/home/user/virtualenv/myenv/lib/python2.6/site-packages 
/usr/local/lib/python2.6/site-packages 
Các vấn đề liên quan