2009-05-01 8 views
9

Sto provando a creare una distribuzione Python con distutils. Purtroppo, la mia struttura di directory simile a questo:Come posso ottenere il mio setup.py per utilizzare un percorso relativo ai miei file?

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

Ecco la mia setup.py di file:

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

Quando eseguo python setup.py sdist genera correttamente il file manifesto, ma non include i file di origine nella distribuzione . Apparentemente, crea una directory per contenere i file di origine (ad esempio mypackage1), quindi copia ciascuno dei file di origine in mypackage1/../mypackage che li mette all'esterno dello della distribuzione.

Come posso correggere questo, senza forzare la struttura della mia directory a conformarsi a ciò che si aspetta distutils?

risposta

0

Una sorta di soluzione alternativa, ma probabilmente utilizzerei un Makefile che ha rsynced ./mypackage in ./build/mypackage e quindi uso la sintassi delle distutils usuali dall'interno di ./build. Fatto, distutils si aspetta di decomprimere setup.py nella radice del sdist e avere il codice sotto, quindi avrete un diavolo di tempo che lo convince a fare altrimenti.

È sempre possibile eseguire l'atomizzazione della copia quando si effettua la pulizia in modo da non dover rovinare i vcs.

4

Quale struttura di directory si desidera all'interno del file di archivio di distribuzione? Lo stesso della tua struttura esistente?

Si potrebbe impacchettare tutto una directory superiore (code nel tuo esempio) con questo setup.py modificata:

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

dovrete eseguire questo (nella directory code):

python build/setup.py sdist 

Oppure, se si desidera mantenere dist all'interno della build:

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

Mi piace la struttura di directory che stai cercando. Non ho mai pensato che lo setup.py sia stato abbastanza speciale da garantire la presenza nella cartella del codice radice. Ma che piaccia o no, penso che sia quello che gli utenti della tua distribuzione si aspettano che sia. Quindi non sorprende che tu debba ingannare le distutils per fare qualcos'altro. Il parametro data_files è un trucco per ottenere setup.py nella distribuzione nello stesso posto in cui l'hai localizzato.

+5

Non mi interessa molto l'aspetto della struttura nel file di distribuzione, a patto che faccia la cosa giusta quando gli utenti lo tentano e lo installino utilizzando easy_install. Ma la documentazione di Python è assolutamente orribile quando si tratta di questi dettagli - non ho idea di come dovrebbe essere la struttura. E sto ancora pensando all'idea di eseguire uno script nella distribuzione prima che sia installato per installare la distribuzione. –

0

È necessario modificare prima la directory principale, forse?

import os 
os.chdir(os.pardir) 

from distutils.core import setup 

ecc

O se potrebbe essere in esecuzione da qualsiasi luogo (questo è eccessivo, ma ...):

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

ecc Non sono sicuro che questo funziona, ma dovrebbe essere facile da provare

1

Eseguire la configurazione.py dalla cartella principale del progetto

Nel tuo caso, posto setup.py nel codice/

codice/dovrebbe includere anche:

  • LICENSE.txt
  • README.txt
  • INSTALL.txt
  • todo.txt
  • changelog.txt

La quando si esegue "sdist setup.py' si deve auto-gen manifesto tra cui: - tutti i file specificati nel py_modules e/o pacchetti - setup.py - README.txt

Per aggiungi altri file semplicemente modifica a mano il file MANIFEST per includere qualsiasi altro file richiesto dal tuo progetto.

Per una spiegazione un po 'decente di questo read this.

Per vedere un esempio di lavoro checkout my project.

Nota: non metto il manifesto sotto il controllo di versione in modo da non trovare lì.

0

Anche una soluzione errata, ma una giunzione/collegamento della directory del pacchetto all'interno del progetto di generazione dovrebbe funzionare.

Problemi correlati