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.
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
.)
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:
-
{[4] } qui est par défaut à
'.'
c'est-à-dire votre curdir. -
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"]),
J'avais scriptname.py:main
dans mon setup.py console_scripts, le .py
est redondant.