2012-09-17 8 views
27

drzewo Projekt:Konfigurowanie setup.py dla opakowania pojedynczego pliku .py i pojedynczym pliku danych bez konieczności tworzenia żadnych folderów

$. 
├── 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(), 
) 

Teraz, gdy wykonuję python setup.py sdist, a następnie pip install utworzony plik .tar.gz w środowisku wirtualnym, pojawia się następujący komunikat:

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

Program korzysta z tego pliku .txt, więc kończy się niepowodzeniem, gdy próbuje go uruchomić. Nie ma potrzeby instalowania happy_birthday-art.txt w oddzielnym folderze. Chcę zainstalować go w folderze, w którym jest zainstalowany happy_birthday.py. Ponadto nie chcę używać bezwzględnych ścieżek w setup.py. Jak najlepiej skonfigurować mój plik setup.py?

+0

Roszczenie jest to, że awkardness jest od lokalizacji http: // stackoverflow. com/a/5423147/1240268 (która jest bezpłatna, jeśli masz ją w pakiecie) –

Odpowiedz

13

Jeśli masz moduł pojedynczego pliku, taki jak ten, nie zostanie utworzony żaden folder, twój plik .py zostanie przeniesiony bezpośrednio do katalogu, który zawiera inne moduły python (na przykład /usr/lib/pythonX.X/site-packages/). Dlatego masz utworzyć katalog:

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

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

„można określić opcje data_files jako prosty sekwencji plików bez podania katalog docelowy, ale nie jest to zalecane , , a polecenie instalacji wyświetli ostrzeżenie w tym przypadku .Aby zainstalować pliki danych bezpośrednio w katalogu docelowym, pusty ciąg powinien być podany jako katalog . "

Jednak tutaj katalog docelowy NIE jest folderem site-packages, ale prefiksem , który jest źródłem venv. Jeśli chcesz, aby plik .txt znajdował się w katalogu site-packages, to wyglądałoby nie tylko brzydko, ale wydaje się, że tak naprawdę nie jest obsługiwane. Z drugiej strony możliwe jest, aby zainstalować go w innym miejscu w env, na przykład w „share/doc/foo”:

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