У меня есть приложение IronPython, которое обрабатывает записи для правил исключения. По сути, у меня есть структура каталогов как таковая:

Lib \

Lib \ DBCL \ General.py

Lib \ Exclusions \ script.py

Моя программа создает экземпляр среды выполнения IronPython:

Dictionary<String, Object> oDic = new Dictionary<String, Object>();
oDic.Add("Debug", true);
iEngine = Python.CreateEngine(oDic);
iScope = iEngine.CreateScope(new Dictionary<String, Object> { { "sql", iSql } });
iScriptSource = aScript;
iSource = iEngine.CreateScriptSourceFromFile(iScriptSource);

ISql - это класс C # для взаимодействия с SQL (только для записи). iScriptSource, в данном случае, скрипт python: "Lib \ Exclusions \ script.py"

Теперь внутри моего скрипта IronPython я импортирую папку DBCL и файл General:

import DBCL
from DBCL import General

Итак, выполняю script.py:

iSource.Execute(iScope); // Edited 1/10/2014 to show I am passing the scope in.

Внутри моего файла script.py я вызываю General.py для выполнения поиска в SQL (помните, я добавил переменную с именем «sql» через iEngine.CreateScope ()).

Однако IronPython утверждает, что этой глобальной переменной не существует. Но если я сделаю вызов в script.py, он будет существовать как глобальная переменная. Как я могу сделать свои переменные глобально доступными для всех скриптов, которые я импортирую?

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

1
Adam Sears 2 Янв 2014 в 20:26

2 ответа

Лучший ответ

Пожалуйста, проверьте Использование глобальных переменных в функции, отличной от той, которая их создала, третий ответ. Короче говоря, глобальные переменные в python имеют область видимости модуля, а не интерпретатора.

Подозреваю, что в вашем случае в script.py вам понадобится

import DBCL
from DBCL import General
General.sql = sql
1
Community 23 Май 2017 в 11:49

Попробуйте передать область, созданную вами при выполнении скрипта:

iSource.Execute(iScope);

Это должно автоматически внедрить все, что находится в области видимости, в глобальное пространство имен скрипта.

0
Jeff Hardy 10 Янв 2014 в 09:44