2012-09-17 13 views
27

árbol Proyecto:Configuración setup.py para el embalaje de un solo archivo .py y un único archivo de datos sin necesidad de crear ninguna carpeta

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

Ahora cuando hago python setup.py sdist y luego pip install el archivo creado .tar.gz en un entorno virtual me aparece el siguiente mensaje:

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

El programa usa ese archivo .txt por lo que falla al intentar ejecutarlo después.

Pero no quiero instalar happy_birthday-art.txt en una carpeta separada. Quiero instalarlo en la carpeta donde está instalado happy_birthday.py. Además, no quiero tener que usar rutas absolutas en setup.py. ¿Cómo configuro mejor mi archivo setup.py?

+0

La pretensión es que el awkardness es de la ubicación http: // stackoverflow. com/a/5423147/1240268 (que es gratis si lo tiene dentro de un paquete) –

Respuesta

13

Si tiene un módulo de un solo archivo como este, no se creará ninguna carpeta, su archivo .py se moverá directamente al directorio que contiene los otros módulos de python (/usr/lib/pythonX.X/site-packages/, por ejemplo). Es por eso que tiene para crear un directorio:

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

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

"Puede especificar las opciones data_files como una simple secuencia de archivos sin especificar un directorio de destino, pero esto no es recomendable , y el comando de instalación imprimirá una advertencia en este caso. Para instalar los archivos de datos directamente en el directorio de destino, una cadena vacía debe ser indicada como directorio. "

Sin embargo, aquí el directorio de destino no es la carpeta site-packages, pero la carpeta prefijo, que es la raíz de la Venv. Si desea que el archivo .txt resida en el directorio site-packages desnudo, no solo parecerá feo sino que realmente no será compatible. Por otro lado, es posible instalarlo en otra ubicación en el env, por ejemplo, en "share/doc/foo":

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