2009-05-01 16 views
9

Estoy intentando crear una distribución de Python con distutils. Por desgracia, mi estructura de directorios es el siguiente:¿Cómo puedo obtener mi setup.py para usar una ruta relativa a mis archivos?

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

Aquí es mi setup.py archivo:

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]', 
) 

Cuando corro python setup.py sdist genera correctamente el archivo de manifiesto, pero no incluye mis archivos de origen en la distribución . Aparentemente, crea un directorio para contener los archivos fuente (es decir, mypackage1) y luego copia cada uno de los archivos de origen en mypackage1/../mypackage, lo que los pone en fuera de de la distribución.

¿Cómo puedo corregir esto, sin forzar a que mi estructura de directorios se ajuste a lo que espera distutils?

Respuesta

0

Una solución sorta escaso, pero yo probablemente sólo tiene que utilizar un Makefile que ./mypackage rsynced a ./build/mypackage y luego usar la sintaxis distutils habituales desde el interior ./build. El hecho es que, distutils espera descomprimir setup.py en la raíz del sdist y tener el código debajo, así que vas a tener un demonio de tiempo para convencerlo de lo contrario.

Siempre se puede bombardear la copia cuando se haga limpio por lo que no tiene que estropear su VCS.

4

¿Qué estructura de directorios desea dentro del archivo de distribución? ¿Lo mismo que tu estructura existente?

Se puede empaquetar todo lo que uno directorio superior (code en su ejemplo) con este setup.py modificación:

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'] 
) 

que había corrido este (en el directorio code):

python build/setup.py sdist 

o, si se quiere mantener el interior dist de construcción:

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

Me gusta la estructura de directorios que está intentando. Nunca pensé que setup.py fuera lo suficientemente especial como para justificar estar en la carpeta del código raíz. Pero le guste o no, creo que es donde los usuarios de su distribución esperarán que sea. Así que no es de extrañar que tengas que engañar a distutils para que haga otra cosa. El parámetro data_files es un truco para colocar su setup.py en la distribución en el mismo lugar donde lo localizó.

+5

No me importa cómo se ve la estructura en el archivo de distribución, siempre y cuando haga lo correcto cuando los usuarios intenten instalarlo usando easy_install. Pero la documentación de Python es absolutamente horrible cuando se trata de estos detalles: no tengo idea de cómo se supone que debe verse la estructura. Y todavía estoy pensando en la idea de ejecutar un script en la distribución antes de instalarlo para instalar la distribución. –

0

tenerlo cambiar al directorio padre en primer lugar, tal vez?

import os 
os.chdir(os.pardir) 

from distutils.core import setup 

etc.

O si usted puede ser que funcione desde cualquier lugar (esto es una exageración, pero ...):

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

etc. No estoy seguro de que esto funciona, pero debe ser fácil de probar

1

Configuración.py de la carpeta raíz del proyecto

En su caso, el lugar en el código setup.py/

código/debería también incluir:

  • license.txt
  • LEEME.txt
  • archivo INSTALL.txt
  • todo.txt
  • changelog.txt

El cuando se ejecuta "sdist setup.py' se debe auto-generación de un manifiesto que incluye: - todos los archivos especificados en py_modules y/o paquetes - setup.py - LEEME.txt

Para agregue más archivos simplemente edite a mano el archivo MANIFEST para incluir cualquier otro archivo que su proyecto necesite.

Para una explicación algo decente de este read this.

Para ver un ejemplo de pago my project.

Nota: No pongo el MANIFEST bajo control de versión para que no lo encuentre allí.

0

También una solución coja, pero una unión/enlace del directorio del paquete dentro del proyecto de compilación debería funcionar.

Cuestiones relacionadas