2012-09-17 10 views
27

albero Progetto:Impostazione setup.py per il confezionamento di un singolo file .py e un singolo file di dati senza la necessità di creare le cartelle

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

Ora, quando faccio python setup.py sdist e poi pip install il creato .tar.gz file in un ambiente virtuale ottengo il seguente messaggio:

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

Il programma utilizza il file txt in modo non riesce quando si tenta di eseguire in seguito.

Ma io non voglio installare happy_birthday-art.txt in una cartella separata. Voglio installarlo nella cartella in cui è installato happy_birthday.py. Inoltre, non voglio dover utilizzare i percorsi assoluti in setup.py. Come posso impostare al meglio il mio file setup.py?

+0

L'affermazione è che l'awkardness è dal http posizione: // StackOverflow. it/a/5423147/1240268 (che è gratuito se l'hai in un pacchetto) –

risposta

13

Se si dispone di un modulo a file singolo come questo, non verrà creata alcuna cartella, il file .py verrà spostato direttamente nella directory che contiene gli altri moduli python (/usr/lib/pythonX.X/site-packages/, ad esempio). È per questo che avete per creare una directory:

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

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

"È possibile specificare le opzioni data_files come una semplice sequenza di file senza specificare una directory di destinazione, ma questo non è raccomandato , e l'installazione di comando stamperà un avvertimento in questo caso. Per installare i file di dati direttamente nella directory di destinazione, una stringa vuota dovrebbe essere dato come directory."

Tuttavia, qui la directory di destinazione non è la cartella site-packages, ma la cartella prefisso, che è la radice del venv. Se vuoi che il .txt risieda nella directory dei pacchetti del sito, non sembrerebbe solo brutto, ma sembra che non sia supportato. D'altra parte è possibile installarlo in un'altra posizione nel env, per esempio in "share/doc/foo":

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