2009-05-01 16 views
9

Tôi đang cố gắng xây dựng bản phân phối Python với distutils. Thật không may, cấu trúc thư mục của tôi trông như thế này:Làm cách nào để tôi có thể sử dụng setup.py để sử dụng đường dẫn tương đối đến tệp của mình?

 
/code 
    /mypackage 
     __init__.py 
     file1.py 
     file2.py 
     /subpackage 
      __init__.py 
    /build 
     setup.py 

Dưới đây là setup.py tập tin của tôi:

from distutils.core import setup 

setup(
    name = 'MyPackage', 
    description = 'This is my package', 
    packages = ['mypackage', 'mypackage.subpackage'], 
    package_dir = { 'mypackage' : '../mypackage' }, 
    version = '1', 
    url = 'http://www.mypackage.org/', 
    author = 'Me', 
    author_email = '[email protected]', 
) 

Khi tôi chạy python setup.py sdist nó một cách chính xác tạo ra file manifest, nhưng không bao gồm các file nguồn của tôi trong việc phân phối . Rõ ràng, nó tạo một thư mục chứa các tệp nguồn (ví dụ: mypackage1) rồi sao chép từng tệp nguồn vào mypackage1/../mypackage đặt chúng bên ngoài của phân phối.

Tôi làm cách nào để sửa lỗi này, mà không cần cấu trúc thư mục của tôi tuân theo những gì distutils mong đợi?

Trả lời

0

Một cách giải quyết khác nhau nhưng tôi có lẽ chỉ cần sử dụng một Makefile mà rsynced ./mypackage to ./build/mypackage và sau đó sử dụng cú pháp distutils thông thường từ bên trong ./build. Sự thật là, các distutils hy vọng sẽ giải nén setup.py vào thư mục gốc của sdist và có mã bên dưới, vì vậy bạn sẽ có một thời gian để thuyết phục nó làm điều khác.

Bạn luôn có thể nuke bản sao khi bạn làm sạch để bạn không phải làm hỏng vcs của mình.

4

Bạn muốn cấu trúc thư mục nào bên trong tệp lưu trữ phân phối? Giống như cấu trúc hiện tại của bạn?

Bạn có thể đóng gói tất cả mọi thứ một thư mục cao (code trong ví dụ của bạn) với setup.py sửa đổi này:

from distutils.core import setup 

setup(
    name = 'MyPackage', 
    description = 'This is my package', 
    packages = ['mypackage', 'mypackage.subpackage'], 
    version = '1', 
    url = 'http://www.mypackage.org/', 
    author = 'Me', 
    author_email = '[email protected]', 
    script_name = './build/setup.py', 
    data_files = ['./build/setup.py'] 
) 

Bạn muốn chạy này (trong thư mục code):

python build/setup.py sdist 

Hoặc, nếu bạn muốn giữ dist bên trong tòa nhà:

python build/setup.py sdist --dist-dir build/dist 

Tôi thích cấu trúc thư mục bạn đang cố gắng. Tôi chưa bao giờ nghĩ rằng setup.py đủ đặc biệt để đảm bảo nằm trong thư mục mã gốc. Nhưng có thích hay không, tôi nghĩ đó là nơi người dùng phân phối của bạn mong đợi nó sẽ như vậy. Vì vậy, nó không có gì ngạc nhiên khi bạn phải lừa méo để làm một cái gì đó khác. Thông số data_files là một hack để đưa setup.py của bạn vào bản phân phối ở cùng một nơi bạn đã định vị.

+5

Tôi không quan tâm nhiều đến cấu trúc trong tệp phân phối, miễn là nó hoạt động đúng khi người dùng thử và cài đặt nó bằng easy_install. Nhưng các tài liệu Python là hoàn toàn khủng khiếp khi nói đến những chi tiết này - Tôi không có ý tưởng những gì các cấu trúc thậm chí còn phải trông giống như. Và tôi vẫn gói đầu của tôi xung quanh ý tưởng rằng bạn chạy một kịch bản trong phân phối trước khi nó được cài đặt để cài đặt phân phối. –

0

Trước tiên, nó có thay đổi thành thư mục chính không?

import os 
os.chdir(os.pardir) 

from distutils.core import setup 

, vv

Hoặc nếu bạn có thể chạy nó từ bất cứ đâu (đây là quá mức cần thiết, nhưng ...):

import os.path 
my_path = os.path.abspath(__file__) 
os.chdir(os.normpath(os.path.join(my_path, os.pardir))) 

vv Không chắc chắn làm việc này, nhưng phải dễ dàng để thử.

1

Chạy thiết lập.py từ thư mục gốc của dự án

Trong trường hợp của bạn, nơi setup.py trong mã/

mã/cũng nên bao gồm:

  • license.txt
  • README.txt
  • INSTALL.txt
  • TODO.txt
  • CHANGELOG.txt

Các khi bạn chạy "sdist setup.py' phải tự động gen một MANIFEST bao gồm: - bất kỳ tập tin quy định tại py_modules và/hoặc gói - setup.py - README.txt

Để thêm nhiều tệp hơn chỉ cần chỉnh sửa thủ công tệp MANIFEST để bao gồm bất kỳ tệp nào khác mà dự án của bạn cần.

Để được giải thích khá rõ ràng về điều này read this.

Để xem ví dụ làm việc, hãy kiểm tra my project.

Lưu ý: Tôi không đặt MANIFEST trong điều khiển phiên bản để bạn không tìm thấy ở đó.

0

Ngoài ra giải pháp thay thế lame, nhưng một đường giao nhau/liên kết của thư mục gói bên trong dự án xây dựng sẽ hoạt động.

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