wake-up-neo.com

Importfehler beim installierten Paket mit setup.py

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. 

22
Alex

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 setuptoolss 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.)

39
Pavel Anossov

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:

  1. where, die standardmäßig auf '.' eingestellt ist, d. h. Ihr curdir. 
  2. exclude Liste der Elemente, die ausgeschlossen werden sollen

Ich habe normalerweise Tests in meinem Repo, also verwende ich:

from setuptools import find_packages

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

Ich hatte scriptname.py:main in meinen setup.py console_scripts, der .py ist redundant.

0
ThorSummoner