Import modułu z podfolderu

Chcę zaimportować podfoldery jako moduły. Dlatego każdy podfolder zawiera __init__.py. Moja struktura folderów wygląda tak:

src\
  main.py
  dirFoo\
    __init__.py
    foofactory.py
    dirFoo1\
      __init__.py
      foo1.py
    dirFoo2\
      __init__.py
      foo2.py

W moim skrypcie głównym importuję

from dirFoo.foofactory import FooFactory

W tym pliku fabrycznym dołączam podmoduły:

from dirFoo1.foo1 import Foo1
from dirFoo2.foo2 import Foo2

Jeśli wywołam mój foofactory, dostaję błąd, że python nie może zaimportować podmodułów foo1 i foo2:

Traceback (most recent call last):
  File "/Users/tmp/src/main.py", line 1, in <module>
from dirFoo.foofactory import FooFactory
  File "/Users/tmp/src/dirFoo/foofactory.py", line 1, in    <module>
from dirFoo1.foo1 import Foo1
    ImportError: No module named dirFoo1.foo1
Author: Razer, 2012-01-21

4 answers

Nie ma potrzeby, aby zadzierać z PYTHONPATH lub sys.path tutaj.

Aby poprawnie używać importu bezwzględnego w pakiecie, należy również podać nazwę pakietu" root", np.:

from dirFoo.dirFoo1.foo1 import Foo1
from dirFoo.dirFoo2.foo2 import Foo2

Lub możesz użyć względny import :

from .dirfoo1.foo1 import Foo1
from .dirfoo1.foo1 import Foo2
 93
Author: Rob Wouters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-21 16:18:01

/ Align = "left" / (z newbee, keviv22)

Nigdy i nigdy dla własnego dobra, nazywaj foldery lub pliki spacjami lub symbolami takimi jak " - "lub"_". Jeśli to zrobisz, możesz napotkać kilka problemów. podobnie jak mój, powiedzmy, chociaż twoje polecenie importowania jest poprawne, nie będziesz w stanie skutecznie importować pożądanych plików, które są dostępne w takich nazwanych folderach.

Niepoprawne nazwy folderów jako "follows": {]}

  • Generic-Classes-Folder
  • Generic_Classes_Folder

Poprawne nazwy folderów dla powyższego:

  • GenericClassesFolder lub Genericclassesfolder lub genericClassesFolder (lub w ten sposób bez spacji lub symboli specjalnych wśród słów)

Jaki błąd zrobiłem:

Rozważ strukturę pliku.

Parent
   . __init__.py
   . Setup
     .. __init__.py
     .. Generic-Class-Folder
        ... __init__.py
        ... targetClass.py
   . Check
     .. __init__.py
     .. testFile.py
Co chciałem zrobić?
  • od testFile.py, chciałem zaimportować "targetClass.py" plik wewnątrz Generic-Class-Folder file to use the function named "funcexecute" in 'targetClass.py" plik

Jaki rozkaz zrobiłem?

  • from "testFile.py", napisał polecenie, z rdzenia.Generic-Class-Folder.targetClass import functionExecute
  • Wyświetlono błędy typu "SyntaxError: invalid syntax"

Próbowałem wielu wyszukiwań i przeglądałem wiele pytań stoskoverflow i nie mogłem zdecydować, co poszło nie tak. Wielokrotnie sprawdzałem swoje pliki, użyłem pliku {[1] }, wstawiona ścieżka środowiska i ogromnie zmartwiony, co poszło nie tak......

I po długim, długim czasie, domyśliłem się tego podczas rozmowy z moim przyjacielem. Jestem trochę głupi, że używam takich konwencji nazewnictwa. Nigdy nie powinienem używać spacji lub specjalnych symboli do definiowania nazwy dla dowolnego folderu lub pliku. Więc to chciałem przekazać. Miłego dnia!

(przepraszam za ten wielki post... odpuszczam sobie frustrację.... :) Dzięki!)

 14
Author: Vivek22,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-27 12:10:08

Ustaw zmienną środowiskową PYTHONPATH. Na przykład jak ten PYTHONPATH=.:.. (dla rodziny * nix).

Możesz również ręcznie dodać swój bieżący katalog (src w Twoim przypadku) do pythonpath:

import os
import sys
sys.path.insert(0, os.getcwd())
 3
Author: Maxim Kamenkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-21 16:06:42

Powiedz, że twój projekt jest skonstruowany w ten sposób:

+---MyPythonProject
|   +---.gitignore
|   +---run.py
|   |   +---subscripts
|   |   |   +---script_one.py
|   |   |   +---script_two.py

Wewnątrz run.py, można zaimportować Skrypty jeden i dwa przez:

from subscripts import script_one as One
from subscripts import script_two as Two

Teraz, wciąż w środku run.py, będziesz mógł wywołać ich metody za pomocą:

One.method_from_one(param)
Two.method_from_two(other_param)
 0
Author: Flavio Wuensche,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-25 20:34:20