2013-03-12 19 views
19

Ho riscontrato un problema con l'utilizzo di setup.py per l'installazione di un pacchetto python. In primo luogo, ho la seguente configurazione directory:Errore di importazione sul pacchetto installato utilizzando setup.py

maindir 
    |- setup.py 
    |-mymodule 
     |- __init__.py 
     |- mainmodule.py 
     |-subdir 
      |- __init__.py 
      |- submodule.py 

vale a dire la cartella del progetto contiene il setup.py e una directory mymodule, che di per sé contiene due moduli Python in due directory. Il file submodule.py contiene solo

teststring = "hello world" 

mainmodule.py contiene:

from .subdir import submodule 
mainstring = "42" 

e setup.py contiene:

import os 
from setuptools import setup 
setup(
    name = "mytestmodule", 
    version = "0.0.1", 
    description = ("A simple module."), 
    packages=['mymodule'], 
) 

Quando faccio from mymodule import mainmodule con ipython dall'interno sourceTest comportamento funziona come previsto e io può fare riferimento ad es mainmodule.submodule.teststring che mi dà la stringa hello world.

D'altra parte, quando si installa questo 'pacchetto' con python setup.py install e cercare di fare lo stesso (dall'interno di altre directory), ottengo un errore di importazione:

In [1]: from mymodule import mainmodule 
--------------------------------------------------------------------------- 
ImportError        Traceback (most recent call last) 
/home/alexander/<ipython-input-1-cf4c9bafa487> in <module>() 
----> 1 from mymodule import mainmodule 

/home/alexander/build/bdist.linux-i686/egg/mymodule/mainmodule.py in <module>() 

ImportError: No module named subdir 

non vedo che cosa Ho sbagliato, come ho seguito uno Getting started tutorial e rules for importing intra-packages. Suppongo che il mio errore sia davvero minuscolo, ma non riesco a individuarlo e l'aiuto è apprezzato.

risposta

34

si deve elencare tutti i pacchetti in setup, tra cui sottopackage:

setup(
    name = "mytestmodule", 
    version = "0.0.1", 
    description = ("A simple module."), 
    packages=['mymodule', 'mymodule.subdir'], 
) 

oppure si può utilizzare setuptools 's funzione magica find_packages:

from setuptools import setup, find_packages 
setup(
    name = "mytestmodule", 
    version = "0.0.1", 
    description = ("A simple module."), 
    packages=find_packages(), 
) 

Questo è menzionato here:

If you have sub-packages, they must be explicitly listed in packages, but any entries in package_dir automatically extend to sub-packages. (In other words, the Distutils does not scan your source tree, trying to figure out which directories correspond to Python packages by looking for __init__.py files.)

+1

Questo è descritto da qualche parte? C'è qualche documentazione sul contenuto di 'setup' su' distutils'?Non sembra facile trovare la documentazione rappresentativa. – Alex

+0

Aggiunto un collegamento a un esempio dai documenti. –

+0

Per ulteriori riferimenti che spiegano come 'package_dir' è usato in modo ricorsivo per trovare sotto-pacchetti, a condizione che quei sotto-pacchetti siano elencati in' packages', leggi [this] (https://docs.python.org/2/ distutils/setupscript.html # messa in vendita di-tutto-packages). –

5

Tu è necessario specificare i singoli moduli in modo esplicito. Invece di mantenere la complessità dell'aggiunta del modulo a setup.py in qualsiasi momento, è possibile utilizzare il metodo find_packages da setuptools.

find_packages prende due argomenti opzionali:

  1. where che è di default per '.' cioè il vostro CurDir.
  2. exclude lista di cose da escludere

solito ho test nel mio repo, in modo da utilizzare:

from setuptools import find_packages 

packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]), 
0

ho avuto nei miei scriptname.py:main console_scripts setup.py, il .py è ridondante.

Problemi correlati