2010-11-11 32 views
19

Hãy thể hiện sự đơn giản và cập nhật cách tiêu chuẩn để tạo ra một gói python cho python 2.xLàm thế nào để tạo ra một gói 2.x python - trường hợp đơn giản

Tôi muốn sử dụng pip cho việc cài đặt các gói một lát sau.

Các gói phần mềm nên chứa một lớp duy nhất:

class hello: 
    def greet(self): 
    print "hello" 

Một sẽ có thể làm như sau sau:

pip install my_package-0.1.1.... 

Và sau đó sử dụng nó:

from my_package import hello 

h = hello.hello() 
h.greet() 

Những gì tôi đang yêu cầu là:

  • Các thư mục và file layout
  • Nội dung các tập tin
  • lệnh để tạo ra các tập tin gói chia
  • lệnh để cài đặt các gói từ tập tin gói chia (sử dụng tốt nhất pip)

Có là một số howtos mà tôi tìm thấy nhưng tôi vẫn không chắc chắn cách thức này rất đơn giản và bị tước bỏ trường hợp (không có gói lồng nhau, loại bỏ tất cả các tệp và tính năng có thể bỏ qua cho trường hợp đơn giản nhất) sẽ được xử lý và đó là cách hiện đại để làm điều đó.

Tôi muốn câu hỏi này được đưa vào trạng thái wiki cộng đồng, vì vậy bạn sẽ không nhận được bất kỳ điểm nào và tôi sẽ dành đủ thời gian và đánh dấu câu trả lời được chấp nhận sau vài ngày.

Edit:

Tôi có một ví dụ chạy đầu tiên mà tôi muốn chia sẻ, tôi đã sử dụng câu trả lời Marius Gedminas cho nó. Nó không chứa mọi thứ cần có, nhưng nó hoạt động, vì vậy nó có thể chứng minh cốt lõi của quy trình kỹ thuật. Để thêm các phần cần thiết, vui lòng đọc câu trả lời của Marius bên dưới.

Cấu trúc thư mục:

MyProject/ 
    setup.py 
    my_package.py 
    README.txt 
    MANIFEST.in 

setup.py:

from setuptools.import setup 
setup(name='MyProject', 
     version='0.1', 
     py_modules=['my_package']) 

my_package.py:

class hello: 
    def greet(self): 
    print "hello" 

MANIFEST.in:

include *.txt 

Để tạo các gói từ thư mục này, đi vào MyProject thư mục và chạy:

$ python setup.py sdist 

Điều này sẽ tạo ra một file MyProject-0.1.tar.gz trong một thư mục con dist/. Sao chép tệp này vào một thư mục trên máy mục tiêu.

Trên máy mục tiêu chạy lệnh này trong thư mục chứa MyProject-0.1.tar.gz:

sudo pip install MyProject-0.1.tar.gz 

Nó có thể là cần thiết để đăng xuất và đăng nhập lại trên máy mục tiêu bây giờ, vì vậy các gói sẽ được tìm thấy. Sau đó bạn có thể kiểm tra các gói trên máy mục tiêu bằng cách sử dụng vỏ python:

$ python 
>>> import my_package 
>>> h = my_package.hello() 
>>> h.greet() 
hello 
>>> 

Một khi điều này các công trình vui lòng nhớ thêm các nội dung cần thiết khác, xem câu trả lời Marius của bên dưới.

+0

Mấu chốt của câu hỏi này là để chọn một cách tiếp cận hiện đại và sau đó loại bỏ gần như tất cả mọi thứ có thể bị tước để nó vẫn hoạt động. – mit

Trả lời

32

Bắt đầu đơn giản

đơn giản gói một file:

MyProject/ 
    setup.py 
    my_package.py 

setup.py đơn giản nhất:

from setuptools import setup 
setup(name='MyProject', 
     version='0.1', 
     author='Your Name', 
     author_email='[email protected]', 
     license='MIT', 
     description='Example package that says hello', 
     py_modules=['my_package']) 

Bao gồm các file phụ trong gói

Tiếp theo, bạn có lẽ nên thêm một README:

MyProject/ 
    MANIFEST.in 
    README.rst 
    setup.py 
    my_package.py 

Lưu ý các tập tin mới - MANIFEST.in.Nó xác định các tập tin không Python phải được bao gồm trong phân phối nguồn của bạn:

include *.rst 

Mọi người sẽ nói với bạn "oh, bỏ qua biểu hiện, chỉ cần thêm các tập tin để kiểm soát nguồn, setuptools sẽ tìm thấy chúng". Bỏ qua lời khuyên đó, nó quá dễ bị lỗi.

Làm trang PyPI hữu ích

Nó rất hữu ích để làm cho README.rst sẵn cho mọi người xem trực tuyến, trên Python Package Index. Vì vậy, hãy thay đổi setup.py của bạn để làm

from setuptools import setup 
with open('README.rst') as f: 
    readme = f.read() 
setup(name='MyProject', 
     ... 
     description='Example package that says hello', 
     long_description=readme, 
     ...) 

Sử dụng đánh dấu ReStructuredText để đánh dấu trang đẹp hơn. Sử dụng

python setup.py --long-description | rst2html 

để bắt lỗi cấu trúc lại sớm.

Hơn một mô-đun Python trong một gói

Một tập tin sẽ không đủ sớm, vì vậy thay đổi nó thành một gói (khó hiểu cảnh báo ngữ: Python gói như trong một thư mục với một __init__ py, không phải là trong một chia khép kín lưu trữ):

MyProject/ 
    MANIFEST.in 
    README.rst 
    setup.py 
    my_package/ 
     __init__.py 
     some_module.py 

và thay đổi setup.py để

from setuptools import setup, find_packages 
with open('README.rst') as f: 
    readme = f.read() 
setup(name='MyProject', 
     version='0.2', 
     author='Your Name', 
     author_email='[email protected]', 
     license='MIT', 
     description='Example package that says hello', 
     long_description=readme, 
     packages=find_packages()) 

Phát hành ra công chúng

Get a PyPI account - bạn chỉ cần thực hiện việc này một lần.

Để thực hiện phát hành, chắc chắn số phiên bản trong setup.py là đúng, sau đó chạy

python setup.py sdist register upload 

Vậy là xong.

Telling mọi người cài đặt nó

Nói với họ để

pip install MyProject 

(cùng tên bạn chỉ định trong setup.py như name lập luận để thiết lập())

+2

Tôi đang đặt câu hỏi về "đơn giản nhất" ở đây. Trong khi tôi hoàn toàn đồng ý rằng điều quan trọng là bắt đầu đơn giản, cuối cùng bạn cần phải phát triển. Khi điều đó xảy ra, con đường tăng trưởng phải rõ ràng. –

+0

Thật tuyệt vời, cảm ơn rất nhiều! – mit

+3

Tôi nghĩ rằng bạn đã tìm thấy một sự cân bằng tốt giữa đơn giản và cũng bao gồm các tính năng bổ sung cần thiết nhất. – mit

4

Sau đây được sao chép từ Distutils Tutorial.

layout File:

top 
|-- package 
| |-- __init__.py 
| |-- module.py 
| `-- things 
|  |-- cross.png 
|  |-- fplogo.png 
|  `-- tick.png 
|-- runner 
|-- MANIFEST.in 
|-- README 
`-- setup.py 

Để thực hiện các tarball cài đặt, bạn chỉ cần chạy:

python setup.py sdist 

Để cài đặt gói, sử dụng pip hoặc easy_install:

pip install my_package-1.2.3.tar.bz2 

hoặc

easy_install my_package-1.2.3.tar.bz2 

Ngoài ra, bạn có thể tải nó lên PyPI, đầu tiên đăng ký nó:

python setup.py register 

sau đó tải lên tarball nguồn

python setup.py sdist upload 

Bạn có thể upload trứng nhị phân cũng như (mặc dù không cần thiết):

python setup.py bdist_egg upload 

Sau đó, mọi người có thể cài đặt như sau:

pip install my_package==1.2.3 

hay,

easy_install my_package==1.2.3 
+0

@mit ah tốt; nếu bạn muốn giữ mức tối thiểu, '__import __ ('setuptools'). setup (name = 'myapp')' là đủ :) –

+0

Việc tải lên bdist_eggs không chỉ là không cần thiết mà còn có thể gây hại tích cực. Chỉ làm điều đó nếu bạn đang xây dựng một gói cho Windows cần trình biên dịch C để cài đặt. –

+0

@Marius Gedminas bạn có thể trích dẫn nguồn gốc của bạn về sự độc hại của trứng không? Tôi không sử dụng chúng nhiều, nhưng chúng có thể hữu ích cho những người không có thư viện phát triển được cài đặt (nếu gói có phần mở rộng C). Đối với các cửa sổ, 'bdist_wininst' có thể hoạt động tốt hơn, vì nó cũng hoạt động như một quả trứng (' easy_install' và 'pip' có thể giải nén chúng), nhưng cũng cho phép người dùng cài đặt thông qua giao diện GUI. –

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