LINUX.ORG.RU

Несколько вопросов по Python


0

0

Добрый день, в процессе решения задачи на этом замечательном в некотором плане языке возникли проблемы, которые не смог решить. Буду очень благодарен за помощь=)

1) Есть переменная типа string. В ней содержится название директории, в которой лежит скрипт, например example.py. Нужно сделать его импорт в работающий скрипт.

Пример, чтобы было понятней: выполняющийся скрипт находится в /testing(директория может быть любая). Данная директория содержит поддиректории example1, example2, example3, причем в каждой из них есть файл example.py. Путем расчетов в переменную было записанно example2, тоесть нужно сделать импорт /testing/example/example.py . Как?=) (повторяю, директория может быть любая. Причем уровень вложенности может варьироватся)

2) Есть массив элементов типа string, содержащая в себе названия классов, объекты которых нужно создать по очереди(тоесть одновременно создан один объект класса, последующий затирает предыдущий) и вызвать метод get_data. Есть ли способ их создать, не прибегая к eval?

Спасибо за внимание)))

>1) Есть переменная типа string. В ней содержится название директории, в которой лежит скрипт, например example.py. Нужно сделать его импорт в работающий скрипт.

>Пример, чтобы было понятней: выполняющийся скрипт находится в /testing(директория может быть любая). Данная директория содержит поддиректории example1, example2, example3, причем в каждой из них есть файл example.py. Путем расчетов в переменную было записанно example2, тоесть нужно сделать импорт /testing/example/example.py . Как?=) (повторяю, директория может быть любая. Причем уровень вложенности может варьироватся)

Через exec?

exec("import foo")

?

Midael ★★★★★
()

> 1) Есть переменная типа string. В ней содержится название директории, в которой лежит скрипт, например example.py. Нужно сделать его импорт в работающий скри


http://docs.python.org/lib/module-imp.html


> 2) Есть ли способ их создать, не прибегая к eval?


In [13]: class A:
   ....:     pass
   ....: 

In [14]: name = "A"

In [15]: locals()[name]
Out[15]: <class __main__.A at 0xb784fd7c>

anonymous
()
Ответ на: комментарий от Midael

> Через exec?

Некрасиво, медленно

> anonymous (*) (28.08.2007 21:42:31)

Спасибо, разбираюсь=)

Motiv_studenta ★★
() автор топика

2) getattr(sys.modules["mymodule"], "myclass")()

tailgunner ★★★★★
()

Вообщем-то со 2-ым разобрался, а вот 1-ое немного не пойму. Никто не скинет пример? Буду премного благодарен. например такой: скрипт находится в /testing(директория любая и скрипт не должен от неё зависеть). Надо импортировать файл /testing/news/list.py

Motiv_studenta ★★
() автор топика
Ответ на: комментарий от Motiv_studenta

> Никто не скинет пример?

sys = __import__("sys", globals(), locals(), [])

(ты, конечно, понимаешь, что можешь модифицировать sys.path?)

Если настаиваешь на "всё вручную", то вот тебе цитата из документации: "A more complete example that implements hierarchical module names and includes a reload() function can be found in the module knee. The knee module can be found in Demo/imputil/ in the Python source distribution."

tailgunner ★★★★★
()

import imp

mod_info = imp.find_module('example', ['tests/1'])

MyMod = imp.load_module('example', *mod_info)

Сделал вот так, меня вполне устраивает. Всем спасибо!

А "*" подразумевает передачу параметра как ссылку, а не копию? =)

Motiv_studenta ★★
() автор топика
Ответ на: комментарий от anonymous

Может я не совсем понял, но я б сделал так:

import sys

sys.path.insert(0, somepath)

# Где somepath - строкова, котую вы перед этим задаете как вам надо

import somemodule # Ваш модуль по указанному адресу

somemodule.func # Выполняет все что нужно )

MurrVK
()
Ответ на: комментарий от anonymous

> В питоне все переменные ссылки на объекты и все всегда передается копиями. Про * читайте здесь:

Спасибо, жаль.

Motiv_studenta ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.