IronPython иногда импортирует модули, но не другие

#c# #ironpython

#c# #ironpython

Вопрос:

Короткая версия заключается в том, что это, похоже, не проблема с кодом (хотя, если у кого-нибудь есть программный обходной путь, который позволяет мне сохранить структуру дизайна, это тоже сработало бы). Когда я пытаюсь импортировать какой-либо модуль при определенных обстоятельствах, он не работает должным образом.

 import sys
sys.path.append('C:Python26Lib')
sys.path.append('C:Users<user>DocumentsVisual Studio 2010Projects<Solution>Simulation')
import time # errors out
from XMLRPCBridge.python_ClientAPI.AsyncXMLRPCClient import AsyncXMLRPCClient, RPCPriority # if I remove the previous line this one errors instead
  

файл Python загружается с использованием следующего

 public class StateSimBridge
{
    private ScriptScope pythonModule = Python.CreateRuntime().UseFile("..\..\..\Simulation\AsyncClientPatch.py");

    // errors out before getting any farther than this
    ...
}
  

когда я создаю экземпляр класса из фиктивного основного потока в проекте, все это работает нормально
Однако, когда я загружаю его косвенно из другого проекта, я получаю ошибки об ошибках «нет такого модуля».

 public sealed class SimulationDriver
{
    private static readonly Lazy<SimulationDriver> lazy = new Lazy<SimulationDriver>(() => new SimulationDriver());
    private StateSimBridge.StateSimBridge simulationBridge = new StateSimBridge.StateSimBridge("Garmsir");

    static SimulationDriver()
    {
    }

    private SimulationDriver()
    {
    }

    public static SimulationDriver Instance
    {
        get { return lazy.Value;  }
    }
    ...
}
  

Я даже не уверен, что еще нужно протестировать на этом этапе, поэтому любая помощь приветствуется.

Редактировать: чтобы было ясно, я проверил sys.path в обоих случаях, и обе записи были успешно добавлены. Что меня смущает, так это то, что между этими двумя обстоятельствами будет разница в том, что касается IronPython.

Ответ №1:

Это может быть ошибкой C-P, но я уверен, что

 sys.path.append('C:Python26Lib')
sys.path.append('C:Users<user>DocumentsVisual Studio 2010Projects<Solution>Simulation')
  

это ваша проблема. В Python (например, C, C # и т. Д.) » является управляющим символом. Попробуйте изменить его на (обратите внимание на r!)

 sys.path.append(r'C:Python26Lib')
sys.path.append(r'C:Users<user>DocumentsVisual Studio 2010Projects<Solution>Simulation')
  

и посмотрите, работает ли это. Простой

 print sys.path
  

также может отображаться, действительно ли пути правильные.

Комментарии:

1. Ввод приветствуется, и я попробовал это просто для уверенности (не имело значения). Но, как я уже упоминал, он отлично работает при запуске под IronPython при одних обстоятельствах, но не при других. Он также отлично работает при запуске как чистый Python. Я также пробовал печатать путь в обоих случаях, и они получаются одинаковыми. Оба раза они также по-прежнему выходят с добавлением соответствующих путей.

Ответ №2:

Проблема оказалась в том, что IronPython распределен по двум библиотечным файлам (IronPython.dll и IronPython.Modules.dll ). Тесты, которые я запускал в проекте, работали нормально, но в других проектах это не сработало, потому что (по какой-либо причине) процесс сборки импортировал только IronPython.dll, а не библиотека модулей.