Ich habe ein Problem mit setup.py
zum Einrichten eines Python-Pakets. Zunächst habe ich folgendes Verzeichnis eingerichtet:
maindir
|- setup.py
|-mymodule
|- __init__.py
|- mainmodule.py
|-subdir
|- __init__.py
|- submodule.py
das Projektverzeichnis enthält den setup.py
und ein Verzeichnis mymodule
, das an sich zwei Python-Module in zwei Verzeichnissen enthält. Die Datei submodule.py
enthält nur
teststring = "hello world"
mainmodule.py
enthält:
from .subdir import submodule
mainstring = "42"
und setup.py
enthält:
import os
from setuptools import setup
setup(
name = "mytestmodule",
version = "0.0.1",
description = ("A simple module."),
packages=['mymodule'],
)
Wenn ich from mymodule import mainmodule
mit ipython
von sourceTest
aus mache, funktioniert das Verhalten wie erwartet und ich kann z. mainmodule.submodule.teststring
, der mir die Zeichenfolge hello world
gibt.
Auf der anderen Seite, wenn ich dieses 'Paket' mit python setup.py install
installiere und versuche, dasselbe (aus einem anderen Verzeichnis) zu tun, erhalte ich einen Importfehler:
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
Ich sehe nicht, was ich falsch gemacht habe, als ich den Getting Started Tutorial und Regeln für den Import von Intra-Paketen folgte. Ich vermute, mein Fehler ist ein wirklich kleiner Fehler, aber ich kann ihn nicht erkennen und Hilfe wird geschätzt.
Sie müssen alle Pakete in setup
auflisten, einschließlich der Unterpakete:
setup(
name = "mytestmodule",
version = "0.0.1",
description = ("A simple module."),
packages=['mymodule', 'mymodule.subdir'],
)
Oder Sie können setuptools
s magische Funktion find_packages
verwenden:
from setuptools import setup, find_packages
setup(
name = "mytestmodule",
version = "0.0.1",
description = ("A simple module."),
packages=find_packages(),
)
Dies ist hier :
Wenn Sie über Unterpakete verfügen, müssen diese explizit in Paketen Aufgeführt sein. Die Einträge in package_dir werden jedoch automatisch auf die Unterpakete. Ausgedehnt. (Mit anderen Worten: the Distutils scannt Ihren Quellstruktur, versuchen Sie , um herauszufinden, welche Verzeichnisse Python-Paketen entsprechen, indem Sie nach
__init__.py
-Dateien suchen.)
Sie müssen Ihre einzelnen Module explizit angeben. Anstatt die Komplexität des Hinzufügens von Modul zu setup.py beizubehalten, können Sie die find_packages
-Methode von setuptools
verwenden.
find_packages
nimmt zwei optionale Argumente an:
where
, die standardmäßig auf '.'
eingestellt ist, d. h. Ihr curdir. exclude
Liste der Elemente, die ausgeschlossen werden sollenIch habe normalerweise Tests in meinem Repo, also verwende ich:
from setuptools import find_packages
packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]),
Ich hatte scriptname.py:main
in meinen setup.py console_scripts, der .py
ist redundant.