[Python] Conflitto import path con nose

Marco Giusti marco.giusti a posteo.de
Mer 5 Ago 2015 19:00:52 CEST


On Wed, Aug 05 2015, Manlio Perillo wrote:
> Oggi per la prima volta sto lavorando ad un progetto che contiene più di un
> package:
> 
> pkg/
>     foo/
>     bar/
>     test/
>         foo/
>         bar/
> 
> La directory `test` contiene la test suite.
> 
> Il problema è che quando eseguo i test con nosetests, l'istruzione
> `import foo` importa il package da `pkg/test/foo` invece che `pkg/foo`.
> 
> Ho provato anche con l'opzione `-P --no-path-adjustment` ma niente da
> fare.  Il package è stato correttamente installato con `setup.py develop`
> all'interno di un virtual environment.
> 
> Alla fine ho dovuto rinominare i packages in test:
> 
> pkg/
>     ...
>     test/
>         _foo/
>         _bar/
> 
> Qualcuno può confermare il problema e suggerire una soluzione?

Non saprei dirti, il semplice test che ho fatto sembra funzionare.

    $ tree
    .
    ├── bar
    │   └── __init__.py
    ├── foo
    │   └── __init__.py
    ├── setup.py
    └── test
        ├── bar
        │   ├── __init__.py
        │   └── test_bar.py
        ├── foo
        │   ├── __init__.py
        │   └── test_foo.py
        └── __init__.py

    5 directories, 8 files

    $ cat setup.py
    from setuptools import setup, find_packages

    setup(name="pythonpkg",
          version="0.1",
          packages=find_packages())

    $ nosetests
    ..
    ----------------------------------------------------------------------
    Ran 2 tests in 0.009s

    OK

La prima cosa che ho pensato è che nose cambiasse il path corrente e,
per esempio, trovandosi in test/, importasse i moduli sbalgiati. Così
però non sembra dal mio test. Senza conoscere tutti i dettagli dei
pacchetti le mie sono solo delle speculazioni (anche perché non conosco
nose).

Tuttavia mi chiedo perché tu non abbia organizzato differentemente il
tuo progetto. Io avrei messo tutto sotto un unico ombrello e avrei
creato un pacchetto principale che contenga tutti gli altri. Gli import
li avrei messi assoluti: 

    from pkg.foo import ...
    form pkg.bar import ...
    from pkg.test.foo import ...

e così via.

Tienici informati
Marco

PS. Manlio che chiede aiuto in lista? Credevo che fosse un evento tanto
probabile quanto 'random.random() == random.random()'.


Maggiori informazioni sulla lista Python