Script argumentos e incorporado IronPython
-
05-07-2019 - |
Pergunta
Eu tenho um mecanismo de script embutido na minha aplicação C # que usa IronPython 2. Eu criar o tempo de execução Python e adicionar algumas classes para o namespace global para que o script pode importá-los como módulos.
No entanto, uma coisa (muito básico) Eu não consigo entender é como enviar argumentos de script. Eu percebo que eu poderia apenas criar uma variável com uma lista de argumentos, mas deve haver uma maneira correta de fazê-lo. Além disso, fazê-lo de forma correcta 'Python' me permite compilar os scripts e usar um construtor de documento automatizado chamado Esfinge. Assim, o objetivo final é ser capaz de usar:
import sys
sys.argv
Em um dos meus scripts e tê-lo obter os argumentos o usuário especificado (através do C # app).
Agora, eu chamo o script usando:
// set up iron python runtime engine
_engine = Python.CreateEngine();
_runtime = _engine.Runtime;
_scope = _engine.CreateScope();
// run script
_script = _engine.CreateScriptSourceFromFile(_path);
_script.Execute(_scope);
E eu tentei à procura de uma API para adicionar argumentos de script sem sorte. Eu também tentei acrescentar-los para o caminho do script (_path no exemplo) sem sorte. Tentei com Arquivo CreateScriptSourceFrom e CreateScriptSourceFromSting (que era um tiro longo de qualquer maneira ...).
É o que eu estou tentando fazer mesmo possível?
Solução
Quando você cria o mecanismo, você pode adicionar uma opção "Argumentos" o contém seus argumentos:
IDictionary<string, object> options = new Dictionary<string, object>();
options["Arguments"] = new [] { "foo", "bar" };
_engine = Python.CreateEngine(options);
Agora sys.argv
conterá ["foo", "bar"]
.
Você pode definir options["Arguments"]
a qualquer coisa que implementa ICollection<string>
.
Outras dicas
sys.argv vai finalmente voltar os parâmetros reais passados ??para o aplicativo de hospedagem. Eis algumas maneiras de resolver isso:
- Reescreva seu roteiro para aceitar variáveis ??globais, em seguida, usar ScriptScope.SetVariable
- Execute o script, mas contar com ele para realmente fazê-lo retornar uma classe, que você pode chamar métodos em (muito mais fácil em 4.0 com palavra-chave dinâmica)
- sys.argv Override com sua própria implementação (esta é uma linguagem dinâmica depois de tudo!)