Erreur d'importation sur le package installé en utilisant setup.py

J'ai un problème avec l'utilisation de setup.py pour configurer un paquet python. Tout d'abord, j'ai la configuration de répertoire suivante:

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

C'est-à-dire que le répertoire du projet contient le setup.py et un répertoire mymodule, qui contient lui-même deux modules python dans deux répertoires. Le fichier submodule.py contient juste

teststring = "hello world"

mainmodule.py contient:

from .subdir import submodule
mainstring = "42"

Et setup.py contient:

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

Quand je fais from mymodule import mainmodule avec {[12] } à partir de sourceTest le comportement fonctionne comme prévu et je peux faire référence par exemple mainmodule.submodule.teststring qui me donne la chaîne hello world.

De l'autre côté, lorsque j'installe ce 'package' en utilisant python setup.py install et que j'essaie de faire la même chose (à partir d'un autre répertoire), j'obtiens une erreur d'importation:

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

Je ne vois pas ce que j'ai mal fait, car j'ai suivi un tutoriel de démarrage et des règles pour importer des intra-paquets. Je suppose que mon erreur est vraiment minuscule, mais je ne peux pas la repérer et l'aide est appréciée.

22
demandé sur Alex 2013-03-12 21:29:29

3 réponses

Vous devez lister tous les paquets dans setup, y compris les sous-paquets:

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

Ou vous pouvez utiliser la fonction magique de setuptools find_packages:

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

Ceci est mentionné ici:

Si vous avez des sous-paquets, ils doivent être explicitement listés dans les paquets, mais toutes les entrées dans package_dir s'étendent automatiquement aux sous-paquets. (En d'autres termes, Le Distutils ne scanne pas votre arborescence source, en essayant pour déterminer quels répertoires correspondent aux paquets Python par recherche de fichiers __init__.py.)

38
répondu Pavel Anossov 2013-03-12 17:40:20

Vous devez spécifier explicitement vos modules each. Au lieu de maintenir la complexité de l'ajout de module à setup.py chaque fois, vous pouvez utiliser la méthode find_packages de setuptools.

find_packages prend deux arguments optionnels:

  1. {[4] } qui est par défaut à '.' c'est-à-dire votre curdir.
  2. exclude liste des éléments à exclure

J'ai généralement des tests dans mon repo, donc j'utilise:

from setuptools import find_packages

packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]),
5
répondu Shubham Chaudhary 2015-05-10 18:17:54

J'avais scriptname.py:main dans mon setup.py console_scripts, le .py est redondant.

0
répondu ThorSummoner 2017-12-19 01:04:32