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?

Foi útil?

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:

  1. Reescreva seu roteiro para aceitar variáveis ??globais, em seguida, usar ScriptScope.SetVariable
  2. 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)
  3. sys.argv Override com sua própria implementação (esta é uma linguagem dinâmica depois de tudo!)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top