2012-10-22 66 views
5

Tôi chỉ mới bắt đầu với Python và cần một chút hướng dẫn.Nhập Mô-đun Python trong Thiết bị đầu cuối nhưng không thông qua Unix Shell

Tôi đang sử dụng máy Mac, nhưng tôi đã cài đặt python.org của python cũng như bản cài đặt gốc của Apple.

Tôi đang cố gắng tải lên một số mô-đun bên thứ 3. Khi tôi chạy kịch bản trong IDLE hoặc thông qua Terminal, mọi thứ hoạt động tốt. Khi tôi cố gắng chạy nó như một công việc CRON, tôi nhận được một lỗi nói rằng nó không thể tìm thấy mô-đun bên thứ 3.

Sau khi một số người nói đùa, tôi đã tin rằng đó là PYTHONPATH/sys.path. Tôi tạo ra một kịch bản thử nghiệm để cho tôi thấy con đường của tôi. Vậy tại sao tôi nhận được các đường dẫn khác nhau khi nó chạy qua cửa sổ đầu cuối so với trực tiếp như một kịch bản lệnh shell?

hai câu hỏi của tôi là:

  1. Tại sao họ lại khác nhau?
  2. Làm cách nào để tôi có được quy trình trình bao trực tiếp để tìm Mô-đun bên thứ 3?

Dưới đây là đầu ra sys.path của tôi khi tôi chạy nó trong Terminal:

['/Library/Scripts', 
'/Library/Scripts/$', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python27.zip', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-darwin', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-mac', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-mac/lib-scriptpackages', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/lib-tk', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/lib-old', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/lib-dynload', 
'/Library/Python/2.7/site-packages'] 

Dưới đây là đầu ra sys.path của tôi khi tôi chạy nó trong vỏ (trong trường hợp này tôi đang ở trong AppleScript với một "làm shell script" bước.

"['/Library/Scripts', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC', 
'/Library/Python/2.7/site-packages']" 
+2

Bạn chắc chắn nên xem xét virtualenv; nó sẽ giúp bạn sắp xếp các phiên bản khác nhau của các biến đường dẫn python và dự án cụ thể. –

Trả lời

4

Tại sao họ lại khác nhau?

Vì bạn đang chạy hai trình thông dịch Python khác nhau và chúng có các giá trị mặc định khác nhau là sys.path.

Đó là mục đích — đó là điều cho phép bạn sửa đổi thư viện chuẩn (hoặc trang) của bản cài đặt Python.org, mà không vi phạm cài đặt hệ thống (hoặc bất kỳ công cụ nào do Apple cung cấp phụ thuộc vào cài đặt đó).

Tôi đoán rằng khi bạn chạy python trong cửa sổ dòng lệnh, bạn đang nhận được /usr/local/bin/python (bạn có thể kiểm tra bằng cách gõ which python), đó là lẽ một liên kết đến /Library/Frameworks/Python.framework/Versions/7.3/bin/python (hoặc có thể để một Python.app/Contents/MacOS/python đâu đó trong khuôn khổ đó) . Và Python đó, từ python.org, được biên soạn để thiết lập sys.path xung quanh /Library/Frameworks/Python.framework/Versions/7.3/.

Trong khi đó, khi bạn chạy python qua Launch Services, có lẽ bạn đang nhận được /usr/bin/python, đó là (hy vọng) được xây dựng trong shim xung quanh /System/Library/Frameworks/Python.framework/Versions/2.7/bin/python, được biên soạn để thiết lập sys.path xung quanh /System/Library/Frameworks/Python.framework/Versions/2.7/.

Lý do python làm những việc khác nhau trong những trường hợp là /usr/local/bin không có trong đăng nhập của bạn PATH ở tất cả, nhưng được thêm vào đầu của con đường bởi một dòng trong ~/.profile (hoặc khác) tập tin của bạn. Tệp đó được đọc bởi các phiên trình bao trong Terminal, nhưng không phải bằng các phiên Launch Services.

Nếu bạn muốn sử dụng cùng một Python trong tất cả các môi trường, bạn có thể chạy rõ ràng /usr/local/bin/python hoặc /usr/bin/python thay vì chỉ python.(Bạn cũng có thể nhận được /usr/local/bin vào PATH đăng nhập của bạn, nhưng đó là một ý tưởng rất xấu, hoặc làm cho nó ra khỏi ~/.profile của bạn, nhưng đó là một chút bất tiện.)

Như một mặt lưu ý, đây là một dấu hiệu cho thấy python của bạn. cài đặt tổ chức rất bị hỏng:

/Library/Frameworks/Python.framework/Versions/7.3/lib/python27.zip 

Không có Python 7.3. Tôi rất muốn xem xét gỡ cài đặt và cài đặt lại bản dựng python.org.

Hoặc, đơn giản hơn, gỡ cài đặt và gỡ cài đặt và chỉ sử dụng Python 2.7 được tích hợp sẵn. Nếu bạn muốn có nhiều môi trường, hãy sử dụng virtualenv thay vì nhiều cài đặt. Nếu, ví dụ: Apple cung cấp cho bạn 2.7.2 và bạn thực sự thực sự cần 2.7.3, thì bạn cần cài đặt khác; nếu không, bạn chỉ làm mọi thứ khó khăn hơn vì không có lợi ích.

+0

BTW, tôi tin rằng phiên bản khung công tác '7.3' ở trên là từ bản phân phối OS X của Enthought Python, chứ không phải bản cài đặt bị hỏng. Họ đã sử dụng lược đồ phiên bản khung của riêng họ để cùng tồn tại với python.org Pythons. –