2013-01-19 16 views
7

Diciamo che hai un progetto chiamato proj e in questo progetto si ha la seguente struttura:setup.py: ridenominazione pacchetto src proiettare nome

proj/ 
    dists/ 
    doc/ 
    src/ 
    __init__.py 
    xyz.py 
    abc.py 
    test/ 
    setup.py 

Come si può vedere tutto il contenuto del tuo progetto è in la sottocartella src. Come fare per creare un pacchetto di distribuzione di distutils dalla cartella src?

mia idea ingenua, dopo the tutorial, sarebbe stato scrivere il setup.py in questo modo:

#omitting basics 
setup(
    name='proj', 
    packages=['src'], 
    package_dir={'proj':'src'} 
) 

Ma dopo l'installazione del pacchetto risultante al mio sistema, ho ancora importare src.xyz e non proj.xyz, che sarebbe stato l'obiettivo e il risultato atteso.

risposta

-3

Si può provare ad aggiungere la cartella src al PYTHONPATH prima di chiamare la funzione setup:

import sys, os 
src_path = os.path.join(os.path.realpath(os.path.dirname(__file__)), 'src') 
sys.path.append(src_path) 

E inoltre, solo per essere sul sicuro, quindi si modifica la directory di lavoro:

os.chdir(src_path) 

Dopodiché, dovrebbe essere tutto OK.

Alcuni altri strumenti per il supporto dell'app che supportano dall'interno. Ho pensato che fosse setuptools, risulta PyInstaller. Ma fondamentalmente, è quello che dovrebbe essere fatto, appena sufficiente per importare i tuoi pacchetti direttamente.

Risulta che distutils ha la direttiva package_dir. Questo è quello che dovresti usare, ma è che funziona solo aggiungendo il pacchetto al PYTHONPATH.

+1

io non sono sicuro che hai il problema ancora. Sto provando a scrivere un pacchetto Python che altre persone possano installare facilmente da solo. Non si tratta solo di importare cose che hai scritto in un'altra cartella. – erikbwork

+0

Sì, ho capito, ma il 'setup.py' deve importare cose in un'altra cartella per funzionare. Una volta che questi pacchetti sono nel tuo PYTHONPATH, non importa dove si trovano. Se non ha funzionato per te, dovrai vedere un altro modo, mi dispiace. – jadkik94

+0

Siamo spiacenti, ma non è questo il problema. – erikbwork

4

Si potrebbe risolvere il problema mettendo i file dei pacchetti Python in proj/ directory:

proj/ 
    src/ 
    proj/ 
     __init__.py 
     xyz.py 
     abc.py 
    setup.py 

E cambiando setup.py a:

# ... 
setup(
    name='proj', 
    packages=['proj'], 
    package_dir={'':'src'} 
) 

Non è richiesto dalla distutils ma altri strumenti potrebbe aspettare la directory padre il nome del file __init__.py è uguale al nome del pacchetto Python, ovvero, proj in questo caso.

+0

L'ho fatto e funziona. Non sono sicuro se capisco il tuo ultimo commento, però. Vuoi dire che ci sono strumenti che si aspettano che io abbia una struttura di cartelle come 'proj/src/proj' per funzionare come previsto? Sembra così inefficiente. O sto facendo qualcosa di inefficiente qui? – erikbwork

+0

Intendevo dire che il nome della directory: '/__ init __. Py' dovrebbe essere lo stesso del nome del pacchetto Python, ad esempio, se vedo' __init __. Py', quindi guardando il suo nome della directory padre so che pacchetto Python è. – jfs

2

Ciò è dovuto ad un bug in setuptools qui riportati: https://github.com/pypa/setuptools/issues/250

In sostanza, funziona ma non in modalità dev.Ora su avete 3 soluzioni:

  • link simbolico il pacchetto src come proj (e ignorarlo quando comitting), lo farà funziona out of the box, ma è sporco
  • cambiamento src-proj
  • creare un sottodirectory proj in src e utilizzate le seguenti opzioni:
 
packages=['proj'], 
package_dir={'proj': 'src/proj'}, 
+0

Link al problema setuptools: https://github.com/pypa/setuptools/issues/250 –

+0

Il problema è ora chiuso per 3.5+ – Daniel

Problemi correlati