2012-09-17 20 views
27

cây dự án:Thiết lập setup.py cho bao bì của một file py duy nhất và một tập tin dữ liệu duy nhất mà không cần phải tạo ra bất kỳ thư mục

$. 
├── happy_birthday-art.txt 
├── happy_birthday.py 
├── MANIFEST.in 
├── README.rst 
└── setup.py 

setup.py

from setuptools import setup 

setup(
    name='Happy_birthday', 
    py_modules=['happy_birthday'], 
    data_files=['happy_birthday-art.txt'], 
    entry_points={ 
    'console_scripts': ['happy_birthday = happy_birthday:main', ],}, 
    long_description=open('README.rst').read(), 
) 

Bây giờ, khi tôi làm python setup.py sdist và sau đó pip install tệp đã tạo .tar.gz trong môi trường ảo, tôi nhận được thông báo sau:

warning: install_data: setup script did not provide a directory for 'happy-birthday-art.txt' -- installing right in '/home/username/.virtualenvs/happy_birthday' 

Chương trình sử dụng tệp .txt để nó không thành công khi cố gắng chạy sau đó.

Nhưng tôi không muốn cài đặt happy_birthday-art.txt vào một thư mục riêng biệt. Tôi muốn cài đặt nó trong thư mục nơi happy_birthday.py được cài đặt. Ngoài ra, tôi không muốn phải sử dụng đường dẫn tuyệt đối trong setup.py. Làm cách nào để tôi thiết lập tệp setup.py của mình một cách tốt nhất?

+0

Khiếu nại là awkardness là từ vị trí http: // stackoverflow. com/a/5423147/1240268 (miễn phí nếu bạn có trong gói) –

Trả lời

13

Nếu bạn có mô-đun một tệp như thế này, sẽ không có thư mục nào được tạo, tệp .py của bạn sẽ được chuyển trực tiếp vào thư mục chứa các mô-đun python khác (ví dụ: /usr/lib/pythonX.X/site-packages/). Đó là lý do tại sao bạn để tạo ra một thư mục:

$ . 
|-- happy_birthday/ 
    |-- __init__.py 
    |-- art.txt 
|-- MANIFEST.in 
|-- README.rst 
|-- setup.py 
3

http://docs.python.org/2/distutils/setupscript.html

"Bạn có thể chỉ định các tùy chọn data_files như là một chuỗi đơn giản các tập tin mà không chỉ định một thư mục mục tiêu, nhưng điều này không được khuyến khích , và lệnh cài đặt sẽ in cảnh báo trong trường hợp này. Để cài đặt tệp dữ liệu trực tiếp trong thư mục đích, chuỗi rỗng phải là được cung cấp làm thư mục. "

Tuy nhiên, tại đây thư mục đích KHÔNG phải là thư mục gói trang web, nhưng thư mục tiền tố , đó là gốc của venv. Nếu bạn muốn .txt nằm trong thư mục site-bare, thì nó sẽ trông không chỉ xấu xí mà có vẻ như không được hỗ trợ. Mặt khác, có thể cài đặt nó vào một vị trí khác trong env, ví dụ: "share/doc/foo":

data_files=[('share/doc/foo', ['happy_birthday-art.txt'])],