2009-09-18 36 views
7

Tôi muốn setup.py của mình thực hiện một số hành động tùy chỉnh ngoài việc cài đặt gói Python (như cài đặt tập lệnh init.d, tạo thư mục và tệp, v.v.) Tôi biết mình có thể tùy chỉnh các lớp distutils/setuptools để làm hành động. Vấn đề tôi gặp phải là mọi thứ hoạt động khi tôi cd vào thư mục gói và làm "python setup.py install", nhưng các lớp tùy chỉnh của tôi dường như không được thực hiện khi tôi làm "easy_install mypackage.tar.gz". Dưới đây là tập tin setup.py của tôi (tạo ra một tập tin myfoobar.py trống trong cùng một thư mục để kiểm tra):Làm thế nào để lệnh easy_install thực thi các lệnh tùy chỉnh trong setup.py?

import setuptools 
from setuptools.command import install as _install 

class install(_install.install): 
    def initialize_options(self): 
     _install.install.initialize_options(self) 

    def finalize_options(self): 
     _install.install.finalize_options(self) 

    def run(self): 
     # Why is this never executed when tarball installed with easy_install? 
     # It does work with: python setup.py install 
     import pdb;pdb.set_trace() 
     _install.install.run(self) 

setuptools.setup(
    name = 'myfoobar', 
    version = '0.1', 
    platforms = ['any'], 
    description = 'Test package', 
    author = 'Someone', 
    py_modules = ['myfoobar'], 
    cmdclass = {'install': install}, 
) 

Điều tương tự cũng xảy ra ngay cả khi tôi nhập "thiết lập" và "cài đặt" từ distutils. Bất kỳ ý tưởng làm thế nào tôi có thể làm cho easy_install thực hiện các lớp học tùy chỉnh của tôi?

Để làm rõ, tôi không muốn sử dụng thêm bất kỳ thứ gì, như Buildout hoặc Paver.

Trả lời

4

Không thể thực hiện được. Enthought có một phiên bản tùy chỉnh của các công cụ thiết lập để hỗ trợ điều này, nhưng nếu không nó nằm trong trình theo dõi lỗi như một mục danh sách mong muốn đã được thảo luận từ tháng Sáu.

Tuy nhiên, có nhiều cách để lừa hệ thống và bạn có thể cân nhắc chúng. Một cách là có mô-đun quan trọng nhất của bạn, mô-đun luôn được nhập trước tiên khi sử dụng gói của bạn, thực hiện tác vụ cài đặt bài đăng lần đầu tiên được gọi. Sau đó, bạn phải dọn dẹp sau bản thân và xem xét trường hợp bạn không thể ghi vào thư viện vì quản trị viên đã cài đặt gói và người dùng đầu tiên là một người không phải là quản trị viên.

Trong trường hợp xấu nhất, điều này sẽ liên quan đến việc tạo thư mục ~/.mypackage cho người dùng đã từng sử dụng gói và chạy lại các cài đặt sau một lần cho mỗi người dùng mới. Mỗi khi module được nhập, nó sẽ kiểm tra sự tồn tại của ~/.mypackage. Nếu nó không có, nó chạy postinstall và tạo ra nó. Nếu nó ở đó, nó sẽ bỏ qua phần cài đặt sau.

+0

Không phải là câu trả lời tôi đã hy vọng, nhưng tôi đoán điều tốt nhất có thể được đưa ra, vì vậy tôi đang trao nó như là câu trả lời. Cảm ơn! –

5

Paver sẽ thiết lập công cụ cho cấp độ tiếp theo và cho phép bạn viết các tác vụ tùy chỉnh. Nó cho phép bạn mở rộng tệp setup.py điển hình và cung cấp một cách đơn giản để khởi động môi trường Paver.

+0

Tôi biết tôi có thể sử dụng một cái gì đó thêm, như Buildout, hoặc có vẻ như Paver, để làm điều này, nhưng đây không phải là những gì tôi đang yêu cầu. Hãy tưởng tượng một gói trên PyPI mà bạn chỉ muốn mọi người có thể cài đặt với "easy_install package_name". –

+3

Paver có thể được sử dụng theo cách dễ dàng cài đặt và 'python setup.py install' sẽ vẫn hoạt động như bình thường. Trong thực tế, Paver thậm chí không cần phải được cài đặt nếu thiết lập chính xác. Xem: http://packages.python.org/Paver/getting_started.html#but-people-are-used-to-setup-py –

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