Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 25, 2009 07:46:00

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Инструкция __import__ для модулей с русским названием

PooH
Только сегодня копался в жаба-скрипте с комментариями на китайском. Желаете поработать с модулями названными на нем же? wink
с одной стороны это было бы интересно для 1С программистов, которые пишут какой-то модуль по интеграции чего-то с чем-то на питоне, но на счет китайского согласен, хотя у самого комментарии в коде в основном на русском.



Офлайн

#2 Апрель 25, 2009 18:43:02

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Инструкция __import__ для модулей с русским названием

получить переходный модуль от 1С в питон , это уже мысль …. надо учить 1С и перекидывать строки .. тогда жестко программируем будет питон с 1С и наоборот .. тогда можно будет очень интересные штуки творить :) на питоне и перебрасывать в 1С :)

Офлайн

#3 Апрель 26, 2009 17:21:19

nJLyTo
От:
Зарегистрирован: 2008-11-11
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Инструкция __import__ для модулей с русским названием

Ребят, сделал так, но на этот раз получаю ошибку invalid syntax в функции compile():

Программа:

class Test:
def connect_plugin(self, module_name):
module_name += u'.py'
dir_file = chr(92).join([u'c:\\PlugIns', module_name])
try:
f = open(dir_file, 'rt')
obj = compile(f.read(), module_name, 'eval')
globals()['pl'] = eval(obj)
pl.run()
except Exception, ex:
f.close()
print unicode(ex)

t = Test()
t.connect_plugin('new_plugin')
Плагин:
class New_Plugin:
def __init__(self):
self.text = u'Ok'
def run(self):
print self.text



Отредактировано (Апрель 26, 2009 17:47:28)

Офлайн

#4 Апрель 26, 2009 22:24:53

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Инструкция __import__ для модулей с русским названием

Трейсбек в студию

Отредактировано (Апрель 26, 2009 22:25:14)

Офлайн

#5 Апрель 26, 2009 23:28:25

nJLyTo
От:
Зарегистрирован: 2008-11-11
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Инструкция __import__ для модулей с русским названием

В том-то и дело, что показывать нечего: invalid syntax (line 1). Ошибка, как я понимаю, происходит при компиляции плагина.



Офлайн

#6 Апрель 26, 2009 23:52:20

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Инструкция __import__ для модулей с русским названием

nJLyTo
dir_file = chr(92).join()
Замени на:
os.path.join(u'c:\\PlugIns', module_name)
Ну это так, к слову.

nJLyTo
obj = compile(f.read(), module_name, ‘eval’)
А module_name не должен быть в ASCII?
Я бы предложил перевод в транслит. Ну и пробелы на подчерк заменить… Просто ривести имя модуля в подобающий вид.
Или вообще, взять md5.hexdigest плагина и забить на всё.



Офлайн

#7 Апрель 27, 2009 00:25:23

nJLyTo
От:
Зарегистрирован: 2008-11-11
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Инструкция __import__ для модулей с русским названием

Я бы предложил перевод в транслит. Ну и пробелы на подчерк заменить… Просто привести имя модуля в подобающий вид.
t.connect_plugin('new_plugin')
до пробы с русскими названиями пока даже не дошел.
ZZZ
Или вообще, взять md5.hexdigest плагина и забить на всё.
а можно чуть подробнее? Как этот модуль может мне помочь?

Кстати, здесь есть интересный пример компиляции файлов, но и это мне не помогло :)



Офлайн

#8 Апрель 27, 2009 02:46:33

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Инструкция __import__ для модулей с русским названием

А наглядел в коде пару ошибок.

Начать надо с того, что вот это жж не с проста:

if codestring and codestring[-1] != '\n':
codestring = codestring + '\n'
Очень похоже, что оно.

И ещё:
nJLyTo
globals() = eval(obj)
pl.run()
Если я правильно понимаю, то pl, это объект-модуль… А как же создать эксемпряр класса pl.New_Plugin? Или я чего-то не так въезжаю? Никогда сам такими извращениями не страдал и сейчас мне не требуется, так что в доки по compile не полезу по причине природной ленивости.

nJLyTo
а можно чуть подробнее? Как этот модуль может мне помочь?
Для того, чтобы создать уникальное ASCII-имя для плагина. Это когда с русскими именами работать начнёте.

Добавленно:
Моё природное любопытство взяло верх…
Хм… Использовать ‘eval’ как-то не красиво… Всё-таки модуль, это не “single expression”.
Лучше сделайте через ‘exec’ и регистрируйте плагин из самого плагина. Ну типа сделайте базовый класс для всех плагинов в __init__ которого воткните что-то вроде: __builtin__.register_plugin(self). Написать функцию register_plugin и воткнуть её в __builtin__ проблем не составит.



Отредактировано (Апрель 27, 2009 03:03:02)

Офлайн

#9 Апрель 27, 2009 07:38:38

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

Инструкция __import__ для модулей с русским названием

может стоит определять в плагине переменную с определенным именем, которая будет содержать название плагина?
например,
__RUSSIAN_OR_NOT_RUSSIAN_PLUGIN_NAME__ = u“мой плагинчик”



Офлайн

#10 Апрель 27, 2009 09:22:02

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Инструкция __import__ для модулей с русским названием

Dimka665
может стоит определять в плагине переменную с определенным именем, которая будет содержать название плагина?
Скорее, это будет аттрибут класса плагина. MyPlugin.name. Но это уже частности.
Речь идёт о том, что имя модуля не может быть русским и просить плагонописателя приводить его в ASCII, ИМХО, не очень хорошо.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version