2015-12-17 6 views
1

Я пытаюсь импортировать модуль и создать объект своего класса следующим образом:Python: IOError: отсутствуют аргументы в invokation

>>> import scriptsim 
>>> scriptsim.Simulator() 

Но я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
IOError: missing arguments in invokation 

ПРИМЕЧАНИЕ: Как видно, scriptsim правильно установлен, так как при импорте не возникает ошибка. И я использовал команду help следующим образом, чтобы подтвердить отсутствие необходимых аргументов для метода Simulator.

>>> help(scriptsim.Simulator) 

Может кто-нибудь, пожалуйста, помогите мне понять, в чем причина этой ошибки. Спасибо!

+1

Содержит ли конструктор для симулятора любые аргументы? Если да, возможно, вам не хватает этих. – station

+0

Попробуйте сохранить его в переменной. Создайте объект,

sim = scriptsim.Simulator()
, как показано в документации. –

+0

Это было бы очень странно для стандартного модуля python. Оказывается, 'scriptsim' является модулем расширения, и это исключение возникает в' agent_python.c'. Возможно, у вас уже есть источник на вашем компьютере или загрузка [здесь] (http://www.nelsim.com/scriptsim/download_v101.html). Я не понял точной проблемы, но похоже, что где-то требуются аргументы. – tdelaney

ответ

1

scriptsim является модулем расширения C, поэтому информация об исключении и трассировке доступна только в той степени, в которой модуль хочет передать ее вам. Ваша проблема в том, что этот модуль необходимо настроить, и он фактически выводит свою конфигурацию из параметров программной команды (sys.argv). Это зло.

Но если вы посмотрите на его python_agent.c (download and uppack here), вы видите:

Py_GetArgcArgv (&argc, &argv); 
    if (argc < 5) { 
      PyErr_SetString (PyExc_IOError, 
              "missing arguments in invokation"); 
      fatal_error = 1; 
      return -1; 
    } 
    { 
      int tcp_port, read_fn, reg_num; 
      const char *error_msg = NULL; 
      if (sscanf (argv[3], "%d", &tcp_port) != 1) { 
        PyErr_SetString (PyExc_IOError, 
                "invalid argv[3] in invokation"); 
        fatal_error = 1; 
        return -1; 
      } 
      if (sscanf (argv[4], "%d", &read_fn) != 1) { 
        PyErr_SetString (PyExc_IOError, 
                "invalid argv[4] in invokation"); 
        fatal_error = 1; 
        return -1; 
      } 
      if (sscanf (argv[5], "%d", &reg_num) != 1) { 
        PyErr_SetString (PyExc_IOError, 
                "invalid argv[5] in invokation"); 
        fatal_error = 1; 
        return -1; 
      } 

Предполагая, что вы знаете, что tcp_port, read_fn и reg_num, Вы можете кормить модуль, что ему нужно, установив свой собственный sys.argv до первого вызова. Это строки аргументов, поэтому конвертируйте int и т. Д. По мере необходимости.

# copy args and configure simulator 
argv = sys.argv 
try: 
    sys.argv = [argv[0], 'dummy', 'dummy', tcp_port, read_fn, reg_num] 
    sim = scriptsim.Simulator() 
finally: 
    sys.argv = argv 
Смежные вопросы