Python загрузки кодирует во времени выполнения

Я хотел бы загрузить a .py файл во времени выполнения. Это .py файл является в основном файлом конфигурации со следующим форматом:

var1=value  
var2=value  
predicate_function=func line : <return true or false>  

После того как этот файл загружается, я хотел бы смочь получить доступ var1, var2 и predicate_function. Для каждой строки я передам его функции предиката, и если это возвратит false, то я проигнорирую его.

В любом случае я не уверен, как загрузить файл Python во времени выполнения и получить доступ к его переменным.

Разъяснение: может быть любое количество этих файлов конфигурации, которые я должен передать основной программе, и я не буду знать их имена до времени выполнения. Google говорит мне, что я должен использовать __import__. Я не уверен, как правильно использовать тот метод и затем получить доступ к переменным импортированного файла.

17
задан hopper 17 July 2013 в 13:56
поделиться

6 ответов

Вам просто нужно иметь возможность динамически определять импорт, а затем динамически получать переменные.

Допустим, ваш файл конфигурации - bar.py и выглядит так:

x = 3
y = 4
def f(x): return (x<4)

Тогда ваш код должен выглядеть так:

import sys

# somehow modnames should be a list of strings that are the names of config files
#
# you can do this more dynamically depending on what you're doing                                                                                                     
modnames = ['bar']

for modname in modnames:
  exec('import %s' % modname)

for modname in modnames:
  mod = sys.modules[modname]
  for k in mod.__dict__:
    if k[:2] != '__':
      print modname, k, mod.__dict__[k]

Я получаю следующий результат:

bar f <function f at 0x7f2354eb4cf8>
bar x 3
bar y 4

Тогда у вас есть, по крайней мере, все переменные и функции. Я не совсем понял то, что вы хотели от функций предиката, но, возможно, теперь вы сможете получить это самостоятельно.

10
ответ дан 30 November 2019 в 11:12
поделиться

Рендеринг в PNG и использование этого в качестве текстуры на самом деле является разумным способом решения вашей проблемы. Если вам нужен «лучший» способ, все зависит от того, что вы считаете «лучшим». Если речь идет о масштабируемой графике, используйте выходные данные SVG PLPlot и визуализируйте векторные фигуры непосредственно в OpenGL. Если речь идет об избежании промежуточных файлов, можно расширить PLPlot (LGPL лицензионный) для передачи данных в виде блока памяти.

-121--4903858-

No.

Технически, нет. Юникод - это стандарт, определяющий кодовые точки и не требующий определенной кодировки.

Таким образом, можно использовать Юникод с кодировкой UTF-8, и тогда все поместится в одну или короткую последовательность объектов char , и он даже будет иметь нулевое окончание.

Проблема с UTF-8 и UTF-16 заключается в том, что s [i] не обязательно больше является символом, это может быть всего лишь кусок одного, тогда как с достаточно широкими символами можно сохранить абстракцию, что s [i] является единственным символом, то есть не делает последовательностей фиксированной длины при различных преобразованиях.

32-битные целые числа, по крайней мере, достаточно широки, чтобы решить проблему кодовой точки, но они все еще не обрабатывают угловые случаи, например, увеличение числа символов может изменить количество символов.

Так получается, что проблема x [i] не решена полностью даже char32_t, а те другие кодировки делают плохие форматы файлов.

Ваша подразумеваемая точка, таким образом, вполне верна: wchar _ t - это сбой, частично потому, что Windows сделала его только 16 битами, и частично потому, что он не решил каждую проблему и был ужасно несовместим с абстракцией потока байт.

-121--1352235-

Для доступа к другому модулю Python необходимо импортировать его . execfile был упомянут парой человек, но это беспорядочно и опасно. execfile загромождает пространство имен, возможно, даже испортит выполняемый код. Если требуется получить доступ к другому исходному файлу Python, используйте инструкцию import .

Еще лучше было бы вообще не использовать файл Python для настройки, а использовать модуль builtin ConfigParser или формат сериализации, такой как JSON. Таким образом, файлы конфигурации не позволяют выполнять произвольный (возможно, вредоносный) код, не требуют, чтобы люди знали Python для настройки программы, и могут быть легко изменены программным путем.

7
ответ дан 30 November 2019 в 11:12
поделиться

Если вы хотите, чтобы файл конфигурации мог редактироваться пользователем только тогда, когда программа не запущена, просто импортируйте его как обычный файл Python.

т.е.

main.py:

import config
print config.var1

config.py:

var="var12"
var2 = 100.5
1
ответ дан 30 November 2019 в 11:12
поделиться

Синтаксис % w сбреет 3 символов с каждого предмета в списке... не может победить это!

alt text

-121--3266096-

Был бы лучший подход, чтобы мой базовый репозиторий - испытательный сайт репозиторий (с соответствующими рабочими каталог), а затем иметь репозиторий перемещает изменения в новый продуктивный репозиторий сайта, который имеет соответствующий рабочий каталог для база сайта в прямом эфире? Это также позволит мне переместить производство в другого сервера и сохранить цепь развертывания не повреждена.

Да, определенно. Это очень редкий случай, когда вы хотите, чтобы ваш тестовый сайт размещался рядом с вашим производственным сайтом. Это опасно и непрофессионально почти во всех отношениях, не говорить о повреждении базы данных, блокировках веб-серверов и т.д.

У меня обычно есть настройка ВМ для целей тестирования. Работает очень хорошо, и я могу иметь его со мной на ноутбуке во время путешествия.

Использование git для развертывания вашего веб-сайта очень хорошая идея, есть много других людей делает это (например, Rob Conery). Если у вас в любом случае есть интерактивный сайт и сайт тестирования, вы должны иметь отдельные ветви для них в репозитории, настроенные как ветви удаленного отслеживания в соответствующих репозиториях сервера. Рабочий процесс становится таким же простым, как выполнение работы в тестовом филиале, его тестирование, слияние в реальном времени и перевод в оперативный режим.

Честно говоря, не делайте это слишком сложным для себя.

-121--5044531-

Как написано в python официальной документации , если вы просто хотите импортировать модуль по имени, вы можете найти его в словаре sys.modules после использования __ import __ .

Предполагая, что ваша конфигурация находится в myproject.mymodule , вы хотели бы, чтобы:

module_name = 'myproject.mymodule'

import sys
__import__(module_name)
mymodule = sys.modules[module_name]

# Then you can just access your variables and functions
print mymodule.var1
print mymodule.var2
# etc...

Вы также можете использовать возвращаемое значение __ import __ оператор, но вы должны будете полностью понять, как python работает с пространствами имен и областями .

14
ответ дан 30 November 2019 в 11:12
поделиться

Если импортируемый модуль находится в обычном пути поиска, можно использовать __import__.

Если вам нужно загрузить модуль из произвольного пути в файловой системе, используйте imp.load_module.

Обязательно учитывайте последствия для безопасности при загрузке произвольного пользовательского кода.

7
ответ дан 30 November 2019 в 11:12
поделиться

В Python 2.* , execfile работает (я рекомендую передать определенный словарь и получить доступ к переменным оттуда - как говорится в примечании в документации, execfile не может повлиять на вызывающую функцию locals () словарь).

В Python 3. * файл exec был удален, поэтому сделайте его:

with open('thefile.py') as f:
  exec(f.read(), somedict)
2
ответ дан 30 November 2019 в 11:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: