LINUX.ORG.RU

Импорт модуля в сложной структуре, питон

 , , ,


0

1

Добрый день.Никак не получается импортировать класс в другой файл. Структура примерно такая: folder/ .utils/ ..client/ ...client.py ..server/ ...server.py .lib/ ..params.py .web ..backend ...app.py Нужно импортировать из params.py в client.py и app.py. Пробовал через from itstime4science.lib import params при этом запихав во все соответствующие в пути папки __init__.py, пишет ImportError: No module named 'itstime4science'. Можете что-нибудь посоветовать?



Последнее исправление: Argonianin (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft
from socket import *
import sys
import itstime4science.utils.dataemulator.telemetrySenderEmulator
import time
from itstime4science.params import params

Parser = params.Parser()
gen = telemetrySenderEmulator.generateData()
argv = Parser.createParser()
ip_and_port = argv.parse_args(sys.argv[1:])
host = ip_and_port.ip
port = int(ip_and_port.port)
addr = (host, port)
tcp_socket = socket(AF_INET, SOCK_STREAM)
tcp_socket.connect(addr)

while(True):
    try:
        data = gen.getMessage()
        print("Gen data: ", data)
        if not data:
            tcp_socket.close()
            sys.exit(1)
        data = str.encode(data)
        tcp_socket.send(data)
        print(data)
        time.sleep(0.5)
    except KeyboardInterrupt:
        print("\nCtr + C")
        tcp_socket.close()
        sys.exit(1)

tcp_socket.close() 
Argonianin
() автор топика

запихав во все соответствующие в пути папки __init__.py

Это правильно, так ты говоришь питону, что это модули.

Если я правильно понял, у тебя примерно такая структура:

.
├── folder
│   ├── __init__.py
│   ├── lib
│   │   ├── __init__.py
│   │   └── params.py
│   ├── server
│   │   ├── __init__.py
│   │   └── server.py
│   ├── utils
│   │   ├── client
│   │   │   ├── client.py
│   │   │   └── __init__.py
│   │   └── __init__.py
│   └── web
│       ├── backend
│       │   ├── app.py
│       │   └── __init__.py
│       └── __init__.py
└── run.py

Тогда твой основной модуль называется folder и чтобы импортировать params.py в client.py, тебе в client.py нужно написать:

import folder.lib.params
grazor ★★
()
Ответ на: комментарий от Argonianin

В Python 3 если не ошибаюсь, изменились правила импорта модулей, по части допустимости относительных/абсолютных путей.

http://stackoverflow.com/questions/714063/importing-modules-from-parent-folder - тут подсказывают sys.path, попробуй это.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от grazor

всякие относительные импорты это моветон, потому:

1) собери пакет, например, если у тебя либа(проект) фуу то создаешь

foo
   __init__.py
   setup.py <-- google it
   lib
     __init__.py
     params.py

в корне делаешь python setup.py develop, импортируешь в любом месте абсолютный путь: from foo import lib.params etc. про измененные правила не слушай ламеров.

anonymous
()
Ответ на: комментарий от grazor

Если быть точнее, корень называется itstime4science,но не суть. Пытаюсь поднять сервер-снова пишет что не найден params

argo@argo:~/volchkov-dev/itstime4science$ sudo docker-compose up
Recreating itstime4science_web_1
Recreating itstime4science_loadb_1
Attaching to itstime4science_web_1, itstime4science_loadb_1
web_1    | Traceback (most recent call last):
web_1    |   File "backend/app.py", line 2, in <module>
web_1    |     import itstime4science.lib.params
web_1    | ImportError: No module named 'itstime4science'
itstime4science_web_1 exited with code 1

Argonianin
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Попробовал через точки, тоже не пашет

Attaching to itstime4science_web_1, itstime4science_loadb_1
web_1    | Traceback (most recent call last):
web_1    |   File "backend/app.py", line 2, in <module>
web_1    |     from ...lib import params
web_1    | SystemError: Parent module '' not loaded, cannot perform relative import
itstime4science_web_1 exited with code 1

Argonianin
() автор топика
Ответ на: комментарий от Argonianin

Тогда покажи, как ты запускаешь проект. Тебе нужно добавить путь к директории, в которой лежит itstime4science в sys.path, либо запускать скрипт непосредственно из неё [родительской директории].

Но анонимус прав, самое грамотное решение — через создание пакета. Вот пример структуры пакета.

grazor ★★
()
Ответ на: комментарий от Argonianin

сделай через пакет как я написал, это единсвтенный путь если хочешь научится а не накостылять

anonymous
()
Ответ на: комментарий от anonymous

Тогда придётся думать ещё как его к докеру цеплять :(

Argonianin
() автор топика
Ответ на: комментарий от Argonianin

Путь в PYTHONPATH указываешь до директории, в которой лежит каталог itstime4science с проектом? В itstime4science есть файл __init__.py?

grazor ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.