Итак, спасибо всем, кто комментирует раздел комментариев.
Если я сделаю это в пакетном файле:
set foo=Server=FOONAME\SQLEXPRESS,11433;Database=FooDatabase;Trusted_Connection=True;MultipleActiveResultSets=true
И если я сделаю это в приложении C #:
Environment.ExpandEnvironmentVariables("%foo%")
Это работа!
Использовать __import__
импортировать файлы, обеспеченные пользователем. Эта функция возвратит модуль. Используйте это для вызывания функций из импортированного файла.
Использовать try..except
оба на __import__
и на фактическом вызове для фиксации ошибок.
Пример:
m = None
try:
m = __import__("external_module")
except:
# invalid module - show error
if m:
try:
m.user_defined_func()
except:
# some error - display it
Если Вы хотели бы, чтобы пользователь в интерактивном режиме ввел команды, я могу настоятельно рекомендовать модуль кода, часть стандартной библиотеки. Объекты InteractiveConsole и InteractiveInterpreter допускают легкую запись и оценку ввода данных пользователем, и ошибки обрабатываются очень приятно с tracebacks, доступным, чтобы помочь пользователю разобраться в нем.
Просто удостоверьтесь, что поймали SystemExit!
$ python
Python 2.5.1 (r251:54863, Jan 17 2008, 19:35:17)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> shared_var = "Set in main console"
>>> import code
>>> ic = code.InteractiveConsole({ 'shared_var': shared_var })
>>> try:
... ic.interact("My custom console banner!")
... except SystemExit, e:
... print "Got SystemExit!"
...
My custom console banner!
>>> shared_var
'Set in main console'
>>> shared_var = "Set in sub-console"
>>> sys.exit()
Got SystemExit!
>>> shared_var
'Set in main console'
RestrictedPython обеспечивает ограниченную среду выполнения для Python, например, для выполнения недоверяемого кода.
"Мое приложение должно смочь вызвать внешние функции Python (записанный пользователем) как обратные вызовы".
Существует альтернатива, это часто более просто.
Определите классы, которые вызывают функции метода в отдельных моментах. Вы обеспечиваете реализацию по умолчанию.
Ваш пользователь может, затем расширил классы, и обеспечьте соответствующие функции метода вместо обратных вызовов.
Это редко требует глобальных переменных. Также более просто реализовать, потому что Ваш пользователь делает что-то как следующее
import core_classes
class MyExtension( core_classes.SomeClass ):
def event_1( self, args ):
# override the default behavior for event_1.
core_classes.main( MyExtension )
Это работает очень гладко и позволяет максимальную гибкость. Ошибки всегда будут в их коде, так как их код является "основным" модулем.