我已经在我的 C#-Application 中成功实现了 IronPython。我将所有脚本存储在数据库中,并在需要时加载它们。现在我想用 PTVS 调试我的 Python 代码。但是当我尝试将远程调试器连接到我的应用程序时,visual studio 总是说我应该使用 ptvsd.enable_attach()

  • 我想如果我为我的 Python 引擎启用 Debug模式就足够了
  • 如果我需要导入 ptvsd,我该如何导入脚本( ini main ,...)我应该将它们也放入我的数据库中吗?

  • 我无法弄清楚这一点,并尝试了很多,但没有任何真正的工作。

    编辑 :
    我可以弄清楚如何使用 ptvsd,我必须“包含”ptvsd 模块:
    //copied from: C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Python Tools for Visual Studio\2.0
    
    string dir = Path.GetDirectoryName("C:\\Support\\Modules\\ptvsd");
    ICollection<string> paths = myScriptEngine.GetSearchPaths();
    
    if (dir != null && dir != "")
    {
        paths.Add(dir);
    }
    else
    {
        paths.Add(Environment.CurrentDirectory);
    }
    

    但现在我在 os.py 中得到一个错误:



    在行中:
    _copy_reg.pickle(statvfs_result, _pickle_statvfs_result,
        _make_statvfs_result)
    

    编辑 2 :似乎我可以忽略带有全局名称的错误消息。
    但现在我收到以下消息:



    编辑 3 :我使用以下代码解决了 Tracing 和 Frames 的错误:
            Dictionary<string, object> options = new Dictionary<string, object>();
            options["Debug"] = true;
            options["Tracing"] = true;
            options["Frames"] = true;
            myScriptEngine = Python.CreateEngine(options);
    

    但是现在我遇到了下一个问题,我无法将 Visual Studio 附加到我的应用程序,我总是收到以下错误消息:



    编辑 4:
    我的python代码:
    # -----------------------------------------------
    # Framework-Root-Script
    # This script is the main-framework script
    #  Autor: BE
    #  Date: 07.10.2013
    # -----------------------------------------------
    
    # --------------------------------------------
    import sys
    #import atexit
    import ptvsd
    
    ptvsd.enable_attach(None)
    #ptvsd.wait_for_attach()
    
    #
    from System import *
    from System.Windows import MessageBox
    from System.Windows.Controls import Grid, MenuItem
    from ESS.MS.Base import GlobalSettings
    from ESS.MS.Framework.Core.TaskbarNotification import TaskbarNotificationManager
    from ESS.MS.Framework.UIG.Mask import DynamicMaskManager
    # --------------------------------------------
    
    # --------------------------------------------
    #<summary>
    #Eine Instanz dieser Klasse wird automatisch mit
    #dem Start des DocCenter Studios erstellt.
    #</summary>
    class StudioInstance:
    
        # --------------------------------------------
        # Declarations
    
        # --------------------------------------------
    
        # --------------------------------------------
        # Constructor
        def __init__(self):
            pass
        # --------------------------------------------
    
        # --------------------------------------------
        # Will be called before the Login-Window open
        def BeforeUserLogin(self):
            try:
                pass
            except:
                pass
        # --------------------------------------------
    
        # --------------------------------------------
        #<summary>
        #Wird ausgeführt, wenn der Login für einen Benutzer
        # Fehlschlägt
        #</summary>
        #<param Name="InputUserName">Eingegeber Benutzername</param>
        #<param Name="InputDomain">Eingegebene Domain<param>
        def LoginFailed(self, InputUserName, InputDomain):
            try:
                pass
            except:
                pass
        # --------------------------------------------
    
        # --------------------------------------------
        # Will be called if the Login-Process is complete
        def LoginComplete(self, UserName, Domain):
            try:
                # -------------------------------------------------------------------
                # Control auf das Tray-Icon setzten (Linksklick)
                # Mask = DynamicMaskManager.Singleton.GetMaskInstance("Win_DCC_Bediener", False)
    
                # grid = Grid()
                # grid.Children.Add(Mask.VisualElement)
    
                # TaskbarNotificationManager.Singleton.AddTrayPopupControl(grid)
                # -------------------------------------------------------------------
    
                # -------------------------------------------------------------------
                # Context-Menu einttrag auf das Tray-Icon setzten
                # test = MenuItem()
                # test.Header = "Hallo Welt"
                # TaskbarNotificationManager.Singleton.AddContextMenuItem(test)
                # -------------------------------------------------------------------
                pass
            except Exception, e:
                MessageBox.Show(e.ToString())
        # --------------------------------------------
    
        # --------------------------------------------
        # Will be called synchron with the UI (same thread)
        def SyncUpdate(self):
            try:
                pass
            except Exception, e:
                MessageBox.Show(e.ToString())
        # --------------------------------------------
    
        # --------------------------------------------
        # Will be called in a custom thread
        def AsyncUpdate(self):
            try:
                pass
            except:
                pass
        # --------------------------------------------
    
    # --------------------------------------------
    

    编辑 5
    我想我现在可以附加到这个过程。但是当我单击 Visual Studio 调试器窗口中的刷新按钮时,Visual Studio 挂断并且程序不再响应。

    刷新按钮:

    也许有人可以帮助我,谢谢!

    最佳答案

    假设该进程在 localhost 上运行并且您调用了 ptvsd.enable_attach() ,则可能是防火墙问题。您可能需要调整 Windows 防火墙以允许连接到该端口(我认为始终允许 localhost 连接,但我不确定)。

    关于c# - 使用 PTVS 进行 IronPython 远程调试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22336460/

    10-11 05:08