@python_beginnersЭта группа больше не существует

Страница 367 из 1885
Vladimir
27.08.2016
17:58:31
\u043f\u0440\u0438\u0432\u0435\u0442

Zart
27.08.2016
17:58:35
чувак

это обычный жаваскрипт литерал

в котором юникодные символы эскейпами. в питоне точно такой же синтаксис

Google
Vladimir
27.08.2016
17:59:22
ясно. а как это раскодировать правильно?

Zart
27.08.2016
17:59:49
это и есть уже правильная кодировка строк в жсон

если ты на строку смотришь из питона, то по дефолту он пропускает через sys.displayhook, который по дефолту пропускает это через репр

Vladimir
27.08.2016
18:00:24
ладно, как мне разобрать этот жсон чтобы получить кириллицу в логе

Zart
27.08.2016
18:00:30
>>> u'\u0431\u043b\u044f\u0434\u044c' u'\u0431\u043b\u044f\u0434\u044c' >>> print(u'\u0431\u043b\u044f\u0434\u044c') блядь

Юкер
27.08.2016
18:00:40
ясно. а как это раскодировать правильно?
json.dump(users, f, ensure_ascii=False) Это если ты сам записываешь json

Vladimir
27.08.2016
18:00:50
не

это не я записываю

я читаю

Zart
27.08.2016
18:01:12
если ты суешь весь объект - то получишь в логах репр

Vladimir
27.08.2016
18:01:30
да меня и строка устраивает

Zart
27.08.2016
18:01:35
который во втором питоне будет пытаться перегнать всё в аскии и будет писать в такой нотации

log.debug('got text from %s: %s', response.json['result']['from']['username'], response.json['result']['text'])

Google
Zart
27.08.2016
18:04:47
второй питон так же кодирует юникод объекты в утф8 по дефолту если чо

Vladimir
27.08.2016
18:04:59
странно

str.decode не срабатывает на этой строке

Zart
27.08.2016
18:05:35
т.е. logging.basicConfig(filename='out.log', ...) log.debug(u'кириллица: %s', u'тест')

а почему он должен работать на юникоде?

Vladimir
27.08.2016
18:06:39
ладно, короче json.loads декодирует, да и ладно

Andrey
27.08.2016
18:07:06
123

Zart
27.08.2016
18:08:32
json.loads 1) по дефолту считает что файл в утф8 2) читает и парсит его аналогично жскрипту, читая строки в утф и декодируя их из литералов в родные питоновые юникодные строки 3) декод ясен пень работать не будет, так как тебе уже прилетел полностью десериализованный вариант

Stanislav
27.08.2016
18:09:07
Ребята? Где почитать про парсинг модулей? Я хочу достучатся к файлу который лежит дерикторией выше, но не в $PATH и не в той же папке

Марк
27.08.2016
18:10:04
эм

Модуль os

Zart
27.08.2016
18:10:10
ты хуйню хочешь

Марк
27.08.2016
18:10:20
Или сис пас.

Zart
27.08.2016
18:10:23
"достучаться" - это что?

Stanislav
27.08.2016
18:10:54
import script

Импортировать некие функции с него

Zart
27.08.2016
18:11:34
у тебя скрипт запущен в каталоге

и ты хочешь именно импортировать то, что каталогом выше?

Stanislav
27.08.2016
18:11:56
Да

Zart
27.08.2016
18:12:14
и под каким именем?

Google
Stanislav
27.08.2016
18:12:16
Возможно даже на два или три каталога выше

Zart
27.08.2016
18:12:40
в питоне импорты не работают с файлами и каталогами

а с модулями и пакаджами. которые могут не иметь отношения к файловой системе вообще

Stanislav
27.08.2016
18:14:22
Хорошо, а тут пишет - the directory containing the input script (or the current directory). - PYTHONPATH (a list of directory names, with the same syntax as the shell variable PATH). - the installation-dependent default.

The Module Search Path

Zart
27.08.2016
18:15:15
и?

это не список поиска инклудов как во всяких пхп

Марк
27.08.2016
18:16:23
sys.path.insert(0,"lib")

Zart
27.08.2016
18:16:34
марк, пройди нахуй с этими советами, пазазя

Марк
27.08.2016
18:16:56
Нормальные советы.

Zart
27.08.2016
18:16:59
нет

Марк
27.08.2016
18:17:15
Всё ровно работает. Не пизди

Zart
27.08.2016
18:17:18
изза таких вот "sys.path.insert" джангоёбы ебались несколько лет

всё?

бгыгыгы

Марк
27.08.2016
18:17:37
А причем тут джанго?

Zart
27.08.2016
18:17:48
а она тоже делала именно это

Stanislav
27.08.2016
18:17:59
Я не шарю в пхп Просто если модуль который я хочу импортнуть а) в папке .getcwd(), б) в папке для модулей питона - то выйдет

Zart
27.08.2016
18:18:03
совала в патх одновременно каталог проекта и пакаджа в нем

Google
Марк
27.08.2016
18:18:10
У меня вот в тестах подключение либ идет. И норм

Stanislav
27.08.2016
18:18:26
А если модуль выше будет, то как оно его найдет?

Stanislav
27.08.2016
18:18:56
у тебя подход кривой изначально
Согласен, в архитектуре не шарю

Zart
27.08.2016
18:19:01
У меня вот в тестах подключение либ идет. И норм
так можно, да. но понимать при этом что происходит

ок, если не вдаваться в кучу очень важных деталей импорта, то сильно-сильно упрощая можно объяснить импорты питона так

sys.path содержит список каталогов когда мы делаем import foo.bar.baz то происходит пачка импортов по цепочке

скажем у нас есть sys.path=['/python/lib', '/python/lib/site-packages']

сперва импортируется foo - для этого питон проходит по sys.path и ищет /python/lib/foo/__init__.py /python/lib/foo.py /python/lib/site-packages/foo/__init__.py /python/lib/site-packages/foo.py

в /python/lib обычно находятся стандартные модули как os.py, sqlite3/__init__.py, и т.п.

Admin
ERROR: S client not available

Zart
27.08.2016
18:23:18
в сайт-пакаджи обычно пип ставит пакеты и они находятся там

теперь есть один нюанс. когда питоном запускается скрипт, в начало сис.патх вставляется '' строка, которая значит "каталог скрипта"

⬗VLAD⌶K⬖
27.08.2016
18:24:56
А если модуль выше будет, то как оно его найдет?
модуль выше ищется по такой схеме - ../../ два раза вверх

Zart
27.08.2016
18:25:05
т.е. у нас есть script1.py, script2.py где в script1 стоит строка import script2 python script1.py - начнет искать с каталога скрипта и загрузит скрипт2 как модуль

Stanislav
27.08.2016
18:25:24
модуль выше ищется по такой схеме - ../../ два раза вверх
Но его нет в sys.path изначально. У меня косяк в архитектуре

А инсертить - зашквар

Zart
27.08.2016
18:25:57
т.е. из этой схемы видно что "импорт бля" будет искать бля лишь в определенных каталогах, куда вышестоящие не входят никак

теперь почему я спросил про имя в самом начале

Google
Stanislav
27.08.2016
18:26:27
Zart
27.08.2016
18:26:30
ок, мы послушаем марка и сделаем sys.path.insert(0, '..')

Zart
27.08.2016
18:26:49
и сделаем import name (без .py разумеется)

и он таки его найдет, да

думаю понятно что на имена файлов, которые не имеют валидного имени идентификатора (как second-script) это не прокатит

но вот возможность случайно заимпортить чтото лишнее появляется

конкретно в этом случае шансы малы

конкретно в джанге, на этом спотыкались все подряд, включая саму джангу

они эту хуйню делали чтобы упростить людям импорт настроек типа что оно работало и по import project.settings и import settings

для этого каталог пакаджа проекта совался в sys.path

Марк
27.08.2016
18:30:35
Zart
27.08.2016
18:30:45
но есть маааааленькая проблема. для каждого имени создавался свой объект-модуль с копией и если кому-то хотелось менять настройки на лету меняя переменную в сеттингс - одна из копий не обновлялась

а так как при импорте у нас код выполняется, то это еще приводило к массе интересных побочных эффектов, когда под одним вебсервером некоторые методы дёргались по одному разу, а в другом - по два

если необходимо запускать произвольное питоноговно откуда попало, то есть несколько способов

⬗VLAD⌶K⬖
27.08.2016
18:33:30
есть еще вариант перейти выше по директории через апи вызовы командной строки cd ..

Zart
27.08.2016
18:33:33
один - заставить этот левый код жить в каталоге, который прописывать в настройки и через sys.path или __path__ импортировать обычными механизмами

другой вариант - загружать код без механизма импортов через другие методы

Stanislav
27.08.2016
18:34:36
Вообщем: |plugins/ | plugin_name/ | main.py |main_functional.py Это изначальная архитектура, пользователь запускает main.py в папке какого-то плагина, этот main.py делает магию и общается с main_functional.py. Скорее всего довольно косячная архитектура, ибо кроме импортов есть косяк - пользователь будет запускать, искать плагины отдельно. Я думал переделать в вот такое: |plugins/ | plugin_name/ | __init__.py | main.py |main_functional.py |launch_this.py Где пользователь запустит launch_this.py, он спарсит все плагины, в __init__.py будет какая-то информация для отображения в launch_this.py, вообщем после нахождения всех плагинов отобразит что-то типо: Найденные плагины: 1. plugin_name Выберите номер нужного плагина: После выбора номнра плагина отобразятся input() с плагина, и теперь работа будет происходить только с плагином Вот только как это все грамотно сделать

Zart
27.08.2016
18:34:46
например execfile/exec, либо runpy.run_module

дерьмовая какая-то схема, где всё с ног на голову

Stanislav
27.08.2016
18:35:30
А я про вторую

Страница 367 из 1885

Эта группа больше не существует Эта группа больше не существует