2013-03-12 33 views
19

Mam problem z użyciem setup.py skonfigurować pakiet Pythona. Po pierwsze, mam następującą konfigurację katalogów:błąd importu na zainstalowanego pakietu przy użyciu setup.py

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

tj katalogu projektu zawiera setup.py i katalog mymodule, która sama w sobie zawiera dwa moduły Python w dwóch katalogach. Plik submodule.py zawiera tylko

teststring = "hello world" 

mainmodule.py zawiera:

from .subdir import submodule 
mainstring = "42" 

i setup.py zawiera:

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

Kiedy zrobić from mymodule import mainmodule z ipython od wewnątrz sourceTest zachowanie działa zgodnie z oczekiwaniami i ja może odnosić się np mainmodule.submodule.teststring co daje mi ciąg hello world.

Z drugiej strony, kiedy zainstalować ten „pakiet” z wykorzystaniem python setup.py install i spróbować zrobić to samo (z poziomu innego katalogu), pojawia się błąd importowania:

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 

ja nie wiem, co Zrobiłem źle, ponieważ podążałem za Getting started tutorial i rules for importing intra-packages. Przypuszczam, że mój błąd jest naprawdę mały, ale nie mogę go dostrzec i pomoc jest doceniana.

Odpowiedz

34

Trzeba wymienić wszystkie pakiety w setup, w tym podpakietów:

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

lub użyć setuptools „magia funkcja find_packages:

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

to wspomniano 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

Czy to gdzieś zostało opisane? Czy jest jakaś dokumentacja dotycząca zawartości 'setup' na' distutils'?Niełatwo znaleźć reprezentatywną dokumentację. – Alex

+0

Dodano łącze do przykładu z dokumentów. –

+0

W celu uzyskania dalszych informacji, które wyjaśnia, w jaki sposób 'package_dir' jest używane rekursywnie do znajdowania podpakietów, pod warunkiem, że te podpakiety są wymienione w' pakietach ', przeczytaj [to] (https://docs.python.org/2/ distutils/setupscript.html # listing-whole-packages). –

5

You musisz wyraźnie określić swoje moduły. Zamiast utrzymywać złożoność dodawania modułu do pliku setup.py za każdym razem, możesz użyć metody find_packages z setuptools.

find_packages dwóch argumentów opcjonalnych:

  1. where który jest domyślny dla '.' tj swój curdir.
  2. exclude lista rzeczy do wykluczenia

zazwyczaj mam testy w moim repo, więc używam:

from setuptools import find_packages 

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

miałem scriptname.py:main w moich console_scripts setup.py The .py jest zbędny.

Powiązane problemy