
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

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
А если модуль выше будет, то как оно его найдет?

Zart
27.08.2016
18:18:35

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
А инсертить - зашквар

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, '..')

⬗VLAD⌶K⬖
27.08.2016
18:26:48

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
А я про вторую
Эта группа больше не существует