Максим
я на нем проверю
Tishka17
Ладно. Я все ещё не вижу, почему импорт может сломаться
Alex
Ладно. Я все ещё не вижу, почему импорт может сломаться
я тоже... но с учетом градуса неадеквата может быть все что угодно
Alex
я бы хотел посмотреть минимальный код воспроизводящий проблему
Tishka17
я тоже... но с учетом градуса неадеквата может быть все что угодно
Ну теоретически, почему не разрешить юзера грузить свой код в определенных ситуациях.
Tishka17
Может он свой хадуп делает
Alex
вообще импортировать прилетающие модули через importlib.import_module хреновое решение по-определению
Alex
ибо либо он столкнется с необходимостью делать reload одноименных модулей, либо у него будет раздуваться sys.modules.
Alex
что в моих словах было неадекватного?
то что ты пытаешься импортировать код для одноразового выполнения через стандартную систему импорта, не понимая как она работает.
Максим
Хорошо, как лучше это сделать?
Tishka17
Но хз
Tishka17
Пусть импортирует
Alex
Вообще, я бы такое лучше отдельными процессами запускал
так тоже можно и наверное самое безопасное и правильное решение
Максим
Тогда непонятно что не работает. Показывай ошибку импорта
[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'
Alex
1. быстрое но не самое корректное решение - каждый раз ипользовать reload() 2. более правильное решение загружать код и создавать модуль динамически в обход системы импорта 3. как тишка сказал вынести это все нафиг в subprocess.
Максим
Tishka17
зачем люди юзают celery я вообще не знаю
Максим
потому что процессы запускаются в daemon
Максим
Pavel
зачем люди юзают celery я вообще не знаю
люди вообще делают много странных вещей. и использование селери - еще не предел совершенства
Pavel
Потому что это удобно
это как минимум дискуссионный вопрос
Максим
зачем люди юзают celery я вообще не знаю
чтоб решать поставленные задачи
Максим
зачем использовать машину, когда есть ноги?
Tishka17
[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
Tishka17
зачем использовать машину, когда есть ноги?
Эм, зачем возить машину в машине, когда можно просто ездить на машине
Tishka17
да это тот баг о котором я говорил, но не был уверен без детального изучения кода ТС.
на этот баг есть функция, его исправляющая. Хз вообще что ониимели ввиду
Максим
меня ещё в celery привлекает status_update и on_message
Максим
если такая альтернатива есть в multiprocessing то я с удовольствием буду использовать его
Максим
хотя помоему gunicorn тоже не очень любит multiprocessing
Tishka17
ну я про celery vs руками читать из очереди
Максим
если бы можно было руками читать из очереди то я бы так и сделал наверное
Tishka17
а почему нельзя?
Максим
а почему нельзя?
хммм, может и можно
Максим
когда описываешь кому то архитектуру сам понимаешь, что можно его улучшить
Максим
Но про импорты вопрос открыт
Максим
как мне лучше исполнять код не через multiprocessing
Alex
я не берусь сейчас обсуждать проблемы с multiprocessing в celery, нужно посмотреть что там но вот написать свой скрипт враппер который будет выполнять код и выдавать результат и запускать через subprocess что мешает то?
Tishka17
Но про импорты вопрос открыт
вопрос про импорты - судя по всему особенность селери.
I
Ну хорошо, я понимаю почему добавлять что-то в 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
Ну хорошо, я понимаю почему добавлять что-то в 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/, и рабочая директория становится - корневая директория Получается, что пути к зависимостями меняются от откружения Я вижу, что проблемой является платформа (а если хорошо подумать, то это где-то я допускаю ошибку) и не правельный подход к ней Подскажите пожалуйста как организовать архитектуру так, чтобы зависимости имели одинаковые пути и для платформы и для тестов?
Почему у тебя проект запускается из разных мест? Хз что такое кросс бар
I
Ну представь что это просто микросервис(?) который запускает ещё и другой код питона для своей работы
I
и запускается из консоли
Eugene
Доброго всем дня, камрады...у меня вопрос к старожилам...и вопрос вот какой: во мне проснулось желание изучить досконально изучить один из языков программирования...выбор пал на питон...подскажите - можно ли начинать именно с питона и каков порог входа...
Eugene
Заранее спасибо))
Eugene
Eugene
Kirill
Ну хорошо, я понимаю почему добавлять что-то в 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/, и рабочая директория становится - корневая директория Получается, что пути к зависимостями меняются от откружения Я вижу, что проблемой является платформа (а если хорошо подумать, то это где-то я допускаю ошибку) и не правельный подход к ней Подскажите пожалуйста как организовать архитектуру так, чтобы зависимости имели одинаковые пути и для платформы и для тестов?
Сделай в своём коде нормальные "пакеты" с setup.py и устанавливай их в develop-режиме. В pip это опция -e вроде как (editable). В питоне, где-то в site-packages, будет создано нечто вроде симлинки на твои исходники и они будут доступны для импорта не зависимо от того какая текущая рабочая папка.
Co(n)stantine👨‍🔬
а почему именно досконально и только один?
да пусть хотяб один осилит, а там может еще и bash
Co(n)stantine👨‍🔬
😏
Eugene
а почему именно досконально и только один?
))) для начала нужно научиться владеть на приличном уровне чем-то одним, а уж потом расширять кругозор и увеличивать потенциал....
Tishka17
хотя смотря какой город
Sergey
возможно. какой язык первым учить без разницы по сути, если ты ноль в программировании
Sergey
ну, я бы жс не рекомендовал, но, думаю, это вкусовщина
Aphelmion
Все очень зависит от локации, где вы ищете работу.
Aphelmion
С точки зрения изучения пайтон самый удобный. Есть отличная документация. Но не с точки зрения целей. Решайте сначала, чем вы будете заниматься, а уже потом ЯП
Цезарь
Как добавить радикал в калькулятор, если в IDLE Python он не знает об этом знаке?
Цезарь
Калькулятор сам писал*
Цезарь
И ещё как объединить код интерфейса QtDesigner(а) с кодом программы?
Anonymous
Модуль подрубить?
Цезарь
А должен?
Калькулятор же у него встроенный всё-таки.
Artöm
Я не понял, ты хочешь прям √ использовать для корня?
denis ⛅️
а как в numpy сделать разницу с шагом? типа пусть есть массив размера 125 надо сделать разницу между 0 и 60, 1 и 61, 2 и 62....
denis ⛅️
А если первое число 100 то какое второе?
никакое, так делать до 84 индекса если размер 125
denis ⛅️
Сделать два массива и объединить
конкатенация дорогая операция