
Tishka17
22.05.2019
11:46:03

Alex
22.05.2019
11:46:06
тут есть одна интересная бага в celery, возможно это она

Максим
22.05.2019
11:46:28
foo = importlib.import_module("exps." + foobar)

Google

Alex
22.05.2019
11:46:47

Tishka17
22.05.2019
11:46:48

Максим
22.05.2019
11:46:56
потому что оно по другому не работает
скажите мне как по другому и я исправлю

Tishka17
22.05.2019
11:47:18
Просто from exps import foobar?

Максим
22.05.2019
11:47:18
но мои попытки были тщетны
нужно программно

Alex
22.05.2019
11:47:34

Tishka17
22.05.2019
11:47:43
Я бы ещё инит в exps глянул

Максим
22.05.2019
11:47:53

Tishka17
22.05.2019
11:48:23
Там пусто
У тебя в exps нет foobar, с чего этому коду вообще работать?
Вижу только example

Google

Максим
22.05.2019
11:48:35
foobar="example"
и все

Alex
22.05.2019
11:48:49
извращение какое
залей свой код куда-нибудь на гитхаб, минимальный пример воспроизводящий проблему

Максим
22.05.2019
11:49:01
Мне от клиента прилетает файл, в котором есть функция do, которую мне нужно выполнять и получать значение, которое она вернула

Tishka17
22.05.2019
11:49:12
Ух

Alex
22.05.2019
11:49:19
> Мне от клиента прилетает файл, в котором есть функция do,
ох пипец

Максим
22.05.2019
11:49:59

Tishka17
22.05.2019
11:49:59

Максим
22.05.2019
11:50:08
Так проще
который используется в командных нуждах

Alex
22.05.2019
11:50:27
а что не так?
да вообще идея выполнять рандомный код который тебе откуда-то прилетает порочна по-определению

Максим
22.05.2019
11:50:36

Tishka17
22.05.2019
11:50:39

Максим
22.05.2019
11:50:46

Tishka17
22.05.2019
11:50:52

Google

Максим
22.05.2019
11:51:10
потому что скорее всего он будет написан мной и моими друзьями
Подписи?
нет, потому что у юзеров нет намерения что-то сломать

Alex
22.05.2019
11:51:30
кстати а ты случайно не грузишь все эти файлы под одним и тем же именем?
хохмы ради

Максим
22.05.2019
11:51:44
там есть один example
я на нем проверю

Tishka17
22.05.2019
11:52:04
Ладно. Я все ещё не вижу, почему импорт может сломаться

Alex
22.05.2019
11:52:19
я бы хотел посмотреть минимальный код воспроизводящий проблему

Tishka17
22.05.2019
11:52:53
Может он свой хадуп делает

Alex
22.05.2019
11:53:20
вообще импортировать прилетающие модули через importlib.import_module хреновое решение по-определению
ибо либо он столкнется с необходимостью делать reload одноименных модулей, либо у него будет раздуваться sys.modules.

Максим
22.05.2019
11:53:48

Alex
22.05.2019
11:54:38

Максим
22.05.2019
11:55:22
Хорошо, как лучше это сделать?

Tishka17
22.05.2019
11:57:34
Но хз
Пусть импортирует

Google

Alex
22.05.2019
11:58:12


Максим
22.05.2019
11:58:44
Тогда непонятно что не работает. Показывай ошибку импорта
[2019-05-22 16:58:10,452: ERROR/ForkPoolWorker-2] Task runner.run_single[835cb23d-5b32-424f-8f77-c94e5763de1b] raised unexpected: ModuleNotFoundError("No module named 'exps'",)
Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/celery/app/trace.py", line 382, in trace_task
R = retval = fun(*args, **kwargs)
File "/usr/local/lib/python3.6/dist-packages/celery/app/trace.py", line 641, in __protected_call__
return self.run(*args, **kwargs)
File "/root/ad-farm/runner.py", line 26, in run_single
exp = importlib.import_module("exps." + foobar)
File "/usr/lib/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 941, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'exps'

Admin
ERROR: S client not available

Alex
22.05.2019
11:59:50
1. быстрое но не самое корректное решение - каждый раз ипользовать reload()
2. более правильное решение загружать код и создавать модуль динамически в обход системы импорта
3. как тишка сказал вынести это все нафиг в subprocess.

Максим
22.05.2019
12:00:00

Tishka17
22.05.2019
12:00:22
зачем люди юзают celery я вообще не знаю

Максим
22.05.2019
12:00:26
потому что процессы запускаются в daemon

Pavel
22.05.2019
12:01:23

Максим
22.05.2019
12:01:58
зачем использовать машину, когда есть ноги?


Tishka17
22.05.2019
12:05:06
[2019-05-22 16:58:10,452: ERROR/ForkPoolWorker-2] Task runner.run_single[835cb23d-5b32-424f-8f77-c94e5763de1b] raised unexpected: ModuleNotFoundError("No module named 'exps'",)
Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/celery/app/trace.py", line 382, in trace_task
R = retval = fun(*args, **kwargs)
File "/usr/local/lib/python3.6/dist-packages/celery/app/trace.py", line 641, in __protected_call__
return self.run(*args, **kwargs)
File "/root/ad-farm/runner.py", line 26, in run_single
exp = importlib.import_module("exps." + foobar)
File "/usr/lib/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 941, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'exps'
мда, ладно. выглядит как баг-фича в celery на который они забили
https://github.com/celery/celery/issues/3150
https://github.com/celery/celery/issues/3441
Есть вот такое: celery.utils.imports.cwd_in_path()
https://docs.celeryproject.org/en/latest/internals/reference/celery.utils.imports.html#celery.utils.imports.cwd_in_path


Alex
22.05.2019
12:05:42

Tishka17
22.05.2019
12:05:44

Максим
22.05.2019
12:08:17
меня ещё в celery привлекает status_update и on_message
если такая альтернатива есть в multiprocessing то я с удовольствием буду использовать его
хотя помоему gunicorn тоже не очень любит multiprocessing

Tishka17
22.05.2019
12:10:01
ну я про celery vs руками читать из очереди

Google

Максим
22.05.2019
12:11:08
если бы можно было руками читать из очереди то я бы так и сделал наверное

Tishka17
22.05.2019
12:12:54
а почему нельзя?

Максим
22.05.2019
12:16:23
когда описываешь кому то архитектуру сам понимаешь, что можно его улучшить
Но про импорты вопрос открыт
как мне лучше исполнять код не через multiprocessing

Alex
22.05.2019
12:17:25
я не берусь сейчас обсуждать проблемы с multiprocessing в celery, нужно посмотреть что там
но вот написать свой скрипт враппер который будет выполнять код и выдавать результат и запускать через subprocess что мешает то?

Максим
22.05.2019
12:18:08

Tishka17
22.05.2019
12:20:29


I
22.05.2019
12:27:29
Ну хорошо, я понимаю почему добавлять что-то в sys.path, это плохо... Само занятие этим выглядит как-то грубо
Помогите пожалуйста задать себе правильный взгляд на то как держать свою архитекутру
Если бы у меня был простой проект, который бы запускался из одной дирекотрии, здесь было бы всё довольно просто - никаких sys.path не прописываем, зависимости вызываем относительно рабочей директории (например import src.service.database, import src.models.user)
Но у меня проект запускается из разных мест (я только новичек в Python и некоторые знания для меня закрыты)...
Поясню что я имею под этим ввиду, на своём практическом примере:
У меня Python занимается сервисом-платформой протокола WAMP - crossbar.io
и запускается с помощью команды crossbar start
и рабочая директория, это не то откуда вызывалась команда, а директория с настройками этой платформы, т.е. файловая структура имеет такой вид
./
./.crossbar/
./.crossbar/config.json
./src/
./src/services/
./src/services/...
./src/services/...
./src/models/
./src/models/...
./src/models/...
./tests/
./tests/...
./tests/...
и рабочей директорией становится ./.crossbar/ (это первое место запуска кода)
С другой стороны код запускается из тестов, которые я запускаю из корневой директории pytest --rootdir=./tests/, и рабочая директория становится - корневая директория
Получается, что пути к зависимостями меняются от откружения
Я вижу, что проблемой является платформа (а если хорошо подумать, то это где-то я допускаю ошибку) и не правельный подход к ней
Подскажите пожалуйста как организовать архитектуру так, чтобы зависимости имели одинаковые пути и для платформы и для тестов?


Tishka17
22.05.2019
12:31:14
Ну хорошо, я понимаю почему добавлять что-то в sys.path, это плохо... Само занятие этим выглядит как-то грубо
Помогите пожалуйста задать себе правильный взгляд на то как держать свою архитекутру
Если бы у меня был простой проект, который бы запускался из одной дирекотрии, здесь было бы всё довольно просто - никаких sys.path не прописываем, зависимости вызываем относительно рабочей директории (например import src.service.database, import src.models.user)
Но у меня проект запускается из разных мест (я только новичек в Python и некоторые знания для меня закрыты)...
Поясню что я имею под этим ввиду, на своём практическом примере:
У меня Python занимается сервисом-платформой протокола WAMP - crossbar.io
и запускается с помощью команды crossbar start
и рабочая директория, это не то откуда вызывалась команда, а директория с настройками этой платформы, т.е. файловая структура имеет такой вид
./
./.crossbar/
./.crossbar/config.json
./src/
./src/services/
./src/services/...
./src/services/...
./src/models/
./src/models/...
./src/models/...
./tests/
./tests/...
./tests/...
и рабочей директорией становится ./.crossbar/ (это первое место запуска кода)
С другой стороны код запускается из тестов, которые я запускаю из корневой директории pytest --rootdir=./tests/, и рабочая директория становится - корневая директория
Получается, что пути к зависимостями меняются от откружения
Я вижу, что проблемой является платформа (а если хорошо подумать, то это где-то я допускаю ошибку) и не правельный подход к ней
Подскажите пожалуйста как организовать архитектуру так, чтобы зависимости имели одинаковые пути и для платформы и для тестов?
Почему у тебя проект запускается из разных мест?
Хз что такое кросс бар