2010-09-04 32 views
8

Tôi mới sử dụng Python và chủ yếu sử dụng mã của riêng tôi. Nhưng vì vậy bây giờ tôi đã tải về một gói mà tôi cần cho một số vấn đề tôi có.Python: sử dụng các mô-đun đã tải xuống

Ví dụ cấu trúc:

root\ 
    externals\ 
     __init__.py 
     cowfactory\ 
      __init__.py 
      cow.py 
      milk.py 

    kittens.py 

Bây giờ của __init__.py cowfactory không from cowfactory import cow. Điều này cho phép lỗi nhập.

Tôi có thể sửa chữa và thay đổi câu lệnh nhập thành from externals.cowfactory import cow nhưng có gì đó cho tôi biết rằng có cách dễ dàng hơn vì nó không thực tế lắm.

Một cách khắc phục khác có thể là đặt gói sản phẩm bò sữa vào thư mục gốc của dự án của tôi nhưng cũng không gọn gàng lắm.

Tôi nghĩ rằng tôi phải làm điều gì đó với tệp __init__.py trong thư mục bên ngoài nhưng tôi không chắc chắn điều gì.

Trả lời

6

Bên trong gói sản xuất bò, nhập khẩu tương đối nên được sử dụng như from . import cow. Các tập tin __init__.py trong externals là không cần thiết. Giả sử rằng dự án của bạn nằm trong thư mục gốc \ và cowfactory là gói bên ngoài bạn đã tải về, bạn có thể làm điều đó trong hai cách khác nhau:

  1. Cài đặt các module bên ngoài

    gói ngoài Python thường đi kèm với một tập tin " setup.py "cho phép bạn cài đặt nó. Trên Windows, nó sẽ là lệnh "setup.py bdist_wininst" và bạn nhận được một trình cài đặt EXE trong thư mục "dist" (nếu nó xây dựng chính xác). Sử dụng trình cài đặt đó và gói sẽ được cài đặt trong thư mục cài đặt Python. Sau đó, bạn có thể chỉ cần thực hiện một số import cowfactory giống như bạn làm import os.

    Nếu bạn đã cài đặt pip hoặc easy_install: Nhiều gói bên ngoài có thể được cài đặt với chúng (pip thậm chí cho phép gỡ cài đặt dễ dàng).

  2. Sử dụng PYTHONPATH cho sự phát triển

    Nếu bạn muốn giữ lại tất cả phụ thuộc với nhau trong thư mục dự án của bạn, sau đó giữ tất cả các gói bên ngoài trong externals \ thư mục và thêm các thư mục vào PYTHONPATH. Nếu bạn đang sử dụng dòng lệnh, bạn có thể tạo tệp hàng loạt có chứa một cái gì đó như

    set PYTHONPATH=%PYTHONPATH%:externals 
    yourprogram.py 
    

    Tôi thực sự đang làm một việc tương tự, nhưng sử dụng PyDev + Eclipse. Ở đó, bạn có thể thay đổi "Chạy cấu hình" để bao gồm biến môi trường PYTHONPATH với giá trị "externals". Sau khi biến môi trường được đặt, bạn có thể chỉ cần import cowfactory trong các mô-đun của riêng mình. Lưu ý cách tốt hơn from external import cowfactory vì trong trường hợp thứ hai, nó sẽ không hoạt động nữa khi bạn cài đặt dự án của bạn (hoặc bạn phải cài đặt tất cả các phụ thuộc bên ngoài như một gói được gọi là "external").

Các giải pháp tương tự cũng áp dụng cho Linux, nhưng với các lệnh khác nhau.

+0

Cảm ơn, trong GAE tôi cần đưa các thư viện bên ngoài vào dự án. Câu trả lời của bạn đã xóa một vài điều tôi đã thấy trong các dự án/ví dụ GAE khác. – Pickels

1

nói chung, bạn sẽ sử dụng easy_installpip để cài đặt nó cho bạn trong thư mục thích hợp. Có một thư mục site-packages trên cửa sổ nơi bạn có thể đặt gói nếu bạn không thể sử dụng easy_install vì một số lý do. Trên ubuntu, nó là /usr/lib/pythonX.Y/dist-packages. Google cho hệ thống cụ thể của bạn. Hoặc bạn có thể đặt nó ở bất kỳ đâu trên biến môi trường PYTHONPATH của bạn.

Theo nguyên tắc chung, tốt là không đặt libs của bên thứ ba trong cấu trúc thư mục chương trình của bạn (mặc dù có nhiều ý kiến ​​khác nhau về điều khiển nguồn vis này). Điều này giúp cấu trúc thư mục của bạn càng nhỏ càng tốt.

+0

aha Tôi thấy, nhưng với Google App Engine để bao gồm lib phần thứ ba, bạn phải đưa chúng vào thư mục của dự án. – Pickels

+0

@ Pickels, bạn nên chỉnh sửa câu hỏi của mình để làm rõ rằng bạn đang ở trên GAE. – aaronasterling

+0

Tôi đã nghĩ về điều đó nhưng bây giờ tôi biết cách sử dụng các gói bên ngoài với GAE vì thông tin tôi nhận được ở đây nên tôi khá hài lòng. – Pickels

0

Cách dễ nhất là sử dụng biến môi trường $ PYTHONPATH. Bạn đặt nó trước khi chạy kịch bản của bạn như sau:

export $PYTHONPATH=$PYTHONPATH:/root/externals/ 

Bạn có thể thêm bao nhiêu thư mục như bạn muốn (với điều kiện họ riêng biệt bởi :) và trăn sẽ tìm trong tất cả các thư mục khi nhập khẩu.

Các vấn đề liên quan