2010-05-03 17 views
10

phiên bản ngắn: làm cách nào để thoát khỏi cơn ác mộng nhiều phiên bản python?Làm thế nào để duy trì các dự án python tồn tại lâu dài w.r.t. phụ thuộc và phiên bản python?

phiên bản dài: trong nhiều năm, tôi đã sử dụng một số phiên bản python và điều tồi tệ hơn, một số tiện ích mở rộng tới python (ví dụ: pygame, pylab, wxPython ...). Mỗi lần nó được thiết lập khác nhau, với các hệ điều hành khác nhau, đôi khi các kiến ​​trúc khác nhau (như máy PowerPC cũ của tôi).

Ngày nay tôi đang sử dụng một mac (OSX 10.6 trên x86-64) và đó là một cơn ác mộng phụ thuộc mỗi khi tôi muốn khôi phục tập lệnh cũ hơn một vài tháng. Bản thân Python đã có ba hương vị khác nhau trong /usr/bin (2.5, 2.6, 3.1), nhưng tôi đã phải cài đặt 2.4 từ macports cho pygame, cái gì khác (không thể nhớ cái gì) buộc tôi phải cài đặt cả ba loại khác từ macports. cuối ngày tôi là chủ sở hữu hạnh phúc của bảy trường hợp (!) của python trên hệ thống của tôi. Nhưng đó không phải là vấn đề, vấn đề là, không ai trong số họ có các thư viện (ví dụ như cùng một bộ) được cài đặt, một số trong số đó là 32bits, một số 64bits, và bây giờ tôi bị mất khá nhiều.

Ví dụ ngay bây giờ tôi đang cố gắng chạy một kịch bản ba tuổi (không phải bằng văn bản của tôi) được sử dụng để sử dụng matplotlib/numpy để vẽ một âm mưu thời gian thực trong một hình chữ nhật của một cửa sổ wxwidgets. Nhưng tôi thất bại thảm hại: py26-wxpython từ macports sẽ không cài đặt, stock python có wxwidgets đi kèm nhưng cũng có một số xung đột giữa 32 bit và 64 bit, và nó không có vón cục ... thật là một mớ hỗn độn!

Rõ ràng, tôi đang làm mọi thứ theo cách sai. Làm thế nào để bạn chúng ta đương đầu với tất cả sự hỗn loạn đó?

+0

pygame hỗ trợ 2.6, trên thực tế. Nếu macports buộc bạn phải cài đặt 2,4 do đó, macports là sai. –

+0

oop, bạn nói đúng. Tôi cho rằng tôi đã nhầm lẫn một thời gian dài trước đây bởi các sơ đồ đặt tên khó hiểu của macports (tức là * py26-game * VS chỉ * py-game *). Bây giờ tôi sẽ thận trọng hơn :-) Nhưng vẫn ... – Gyom

+0

Cảm ơn bạn đã trả lời tất cả mọi người. Nhưng vấn đề của tôi không được giải quyết ở đây: Tôi đang sử dụng máy OSX 10.6 64 bit và tôi muốn viết chương trình wxpython + matplotlib. Tôi phải làm thế nào ? – Gyom

Trả lời

4

Một số lời khuyên:

  • trên Mac OS X, sử dụng chỉ quá trình cài đặt python trong /Library/Frameworks/Python.framework.
  • bất cứ khi nào bạn sử dụng numpy/scipy/matplotlib, hãy cài đặt phân phối python enthought
  • sử dụng virtualenv và virtualenvwrapper để giữ cho các hệ thống "cài đặt" nguyên sơ; lý tưởng sử dụng một môi trường ảo cho mỗi dự án, do đó, mỗi phụ thuộc của dự án được đáp ứng. Và, vâng, điều đó có nghĩa là có khả năng rất nhiều mã sẽ được nhân rộng trong các envs ảo khác nhau.

Điều đó có vẻ như một mớ hỗn độn lớn hơn thực sự, nhưng ít nhất mọi thứ hoạt động theo cách đó. Về cơ bản, nếu một trong các dự án hoạt động trong virtualenv, nó sẽ tiếp tục hoạt động bất kể bạn nâng cấp gì, vì bạn không bao giờ thay đổi cài đặt "hệ thống".

4

Hãy xem virtualenv.

+1

yay, và ở đây chúng tôi đi cho một lớp nhiều cơn ác mộng: -D – Gyom

+5

@Gyom: Blasphemy! Mọi vấn đề khoa học máy tính đều có thể giải quyết được bằng một lớp trừu tượng khác! – janneb

1

Những gì tôi thường làm là cố gắng (dần dần) theo kịp các phiên bản Python khi chúng xuất hiện (và một khi tất cả các phụ thuộc bên ngoài có sẵn các phiên bản chính xác).

Phần lớn thời gian, mã Python có thể được chuyển như hiện tại chỉ với những sửa đổi nhỏ cần thiết.

lớn nhất @ công việc dự án Python của tôi (15.000+ LOC) tại là trên Python 2.6 một vài tháng (nâng cấp tất cả mọi thứ từ Python 2.5 đã mất hầu hết một ngày do cài đặt/kiểm tra 10+ phụ thuộc ...)

Nói chung, tôi nghĩ đây là chiến lược tốt nhất với hầu hết các thành phần phụ thuộc lẫn nhau trong phần mềm tự do (nghĩ các phụ thuộc trong kho phần mềm linux): giữ cho các phiên bản của bạn (bán) - hiện tại (hoặc ít nhất: tiến triển với cùng tốc độ)).

+0

chắc chắn, nhưng giữ một dự án lớn được cập nhật là khá khác so với việc duy trì nhiều dự án nhỏ. và một số chương trình mà tôi đang làm việc ổn định và bên thứ ba, do đó, đơn giản hơn là chỉ cần đẩy nhanh các phiên bản này đối với đúng phiên bản python thay vì liên tục cập nhật chúng. – Gyom

10

Tôi giải quyết vấn đề này bằng cách sử dụng virtualenv. Tôi thông cảm với mong muốn tránh các lớp trừu tượng về cơn ác mộng, nhưng virtualenv thực sự là tuyệt vời và dễ sử dụng. Bạn thực sự làm điều này (dòng lệnh, Linux):

virtualenv my_env 

Điều này tạo ra một thư mục hệ nhị phân và thư viện mới và liên kết với thư viện hệ thống hiện tại của bạn theo mặc định. Sau đó, để chuyển đổi đường dẫn để sử dụng môi trường mới, bạn thực hiện điều này:

source my_env/bin/activate 

Vậy đó. Bây giờ, nếu bạn cài đặt các mô-đun (ví dụ: với easy_install), chúng sẽ được cài đặt vào thư mục lib của thư mục my_env.Họ không can thiệp vào các thư viện hiện có, bạn không có xung đột kỳ lạ, thứ không ngừng hoạt động trong môi trường cũ của bạn. Họ hoàn toàn bị cô lập.

Để thoát khỏi môi trường, chỉ cần làm

deactivate 

Nếu bạn quyết định làm một sai lầm với một cài đặt, hoặc bạn không muốn môi trường đó nữa, chỉ cần xóa thư mục:

rm -rf my_env 

Và bạn đã hoàn tất. Nó thực sự đơn giản.

virtualenv thật tuyệt. ;)

0

Tôi sử dụng phiên bản MacPorts cho mọi thứ, nhưng khi bạn lưu ý nhiều phiên bản mặc định là kỳ lạ cũ. Ví dụ vim omnicomplete trong Snow Leopard có python25 như một phụ thuộc. Rất nhiều cổng liên quan đến python có các phụ thuộc cũ nhưng bạn thường có thể gắn cờ phiên bản mới hơn tại thời gian xây dựng, ví dụ: port install vim +python26 thay vì port install vim +python. Làm khô trước khi cài đặt bất cứ điều gì để xem nếu bạn đang kéo, ví dụ, toàn bộ python24 khi nó là không cần thiết. Kiểm tra portfiles thường bởi vì quy ước đặt tên như các cảng Darwin đã rời khỏi mặt đất để lại một cái gì đó để được mong muốn. Trong thực tế, tôi chỉ để lại mọi thứ trong thư mục mặc định /opt... của MacPorts, bao gồm một bản sao của toàn bộ khung với các bản sao của PyObjC, v.v, và chỉ gắn với một phiên bản cùng một lúc, giữ lại tùy chọn để trở về mặc định hệ thống nếu mọi thứ phá vỡ bất ngờ. Đó là tất cả có lẽ một chút quá nhiều công việc để tránh sử dụng virtualenv, mà tôi đã có nghĩa là để có được xung quanh để sử dụng.

+0

Tôi đã rời khỏi MacPorts một thời gian dài trước đây. Chỉ cần sử dụng pip và virtualenv cho các nhu cầu Python của bạn và các tệp nhị phân cho mọi thứ khác. Ubuntu là giải pháp nếu bạn muốn quản lý gói phù hợp. –

+0

Vâng, nếu bạn có thể thoát khỏi bằng cách sử dụng phiên bản hệ thống của Python (hoặc một thay thế được đóng gói độc đáo, giống như của Enthought) chắc chắn làm như vậy. MacPorts chỉ là OK nói chung nhưng hoàn toàn rơi xuống khi giao dịch với các ngôn ngữ kịch bản. –

0

Tôi đã may mắn khi sử dụng Buildout. Bạn thiết lập một danh sách những quả trứng và phiên bản nào bạn muốn. Xây dựng sau đó tải xuống và cài đặt các phiên bản riêng tư của từng cho bạn. Nó tạo ra một nhị phân "python" riêng với tất cả các quả trứng đã được cài đặt. Một "nosetests" cục bộ giúp mọi thứ dễ dàng gỡ lỗi. Bạn có thể mở rộng bản dựng bằng các chức năng của riêng bạn.

Về mặt giảm, Buildout có thể khá bí ẩn. Làm "buildout -vvvv" trong một thời gian để xem chính xác những gì nó đang làm và tại sao.

http://www.buildout.org/docs/tutorial.html

1
  • cài đặt các phiên bản python bạn cần, tốt hơn nếu từ các nguồn
  • khi bạn viết một kịch bản, bao gồm phiên bản python đầy đủ vào đó (ví dụ như #!/usr/local/bin/python2.6)

tôi không thể nhìn thấy những gì có thể đi sai.

Nếu có điều gì đó, có thể là lỗi của macports, không phải của bạn (một trong những lý do tôi không sử dụng macports nữa).

tôi biết tôi có thể bị thiếu một cái gì đó và điều này sẽ được downvoted, nhưng xin vui lòng để lại ít nhất một chút bình luận trong trường hợp đó, nhờ :)

+0

điều gì có thể xảy ra? ví dụ thực tế là một số phụ thuộc (ở đây, wxpython) sẽ không biên dịch trên máy tính của tôi. Tất nhiên, bạn có thể đổ lỗi cho macports thay vì đóng góp cho nó, nhưng điều đó không giải quyết vấn đề của tôi :-) – Gyom

0

Ít nhất dưới Linux, nhiều trăn có thể cùng tồn tại khá vui vẻ. Tôi sử dụng Python 2.6 trên một hệ thống CentOS cần Python 2.4 là mặc định cho những thứ hệ thống khác nhau. Tôi chỉ đơn giản biên dịch và cài đặt python 2.6 vào một cây thư mục riêng biệt (và thêm thư mục bin thích hợp vào đường dẫn của tôi), điều này khá là không đau. Sau đó nó được gọi bằng cách gõ "python2.6".

Khi bạn đã cài đặt và chạy riêng các bộ trăn, việc cài đặt thư viện cho một phiên bản cụ thể rất đơn giản. Nếu bạn gọi kịch bản setup.py với python bạn muốn, nó sẽ được cài đặt trong các thư mục thích hợp với python đó, và các script sẽ được cài đặt trong cùng thư mục với python thực thi và sẽ tự động sử dụng python đúng khi được gọi.

Tôi cũng cố gắng tránh sử dụng quá nhiều thư viện. Khi tôi chỉ cần một hoặc hai chức năng từ một thư viện (ví dụ như scipy), tôi sẽ thường xuyên xem liệu tôi có thể sao chép chúng vào dự án của riêng tôi hay không.

+0

cảm ơn cho asnwers của bạn. tuy nhiên, vấn đề tôi mô tả trong câu hỏi chính xác xảy ra vì các thư viện.Và tôi không thể "sao chép" các thư viện này vào dự án khi chúng được viết bằng C (scipy, matplotlib, wxpython) và không phải trong python tinh khiết. – Gyom