【问题标题】:Is there any way to modify the pydevd_file_utils.PATHS_FROM_ECLIPSE_TO_PYTHON value without having to modify that file?有什么方法可以修改 pydevd_file_utils.PATHS_FROM_ECLIPSE_TO_PYTHON 值而无需修改该文件?
【发布时间】:2011-12-21 10:06:30
【问题描述】:

我正在使用 pydev 插件来调试远程应用程序。

此(远程)应用程序的文件结构与运行 Eclipse 的结构不同。当我从 Eclipse IDE 设置断点时,这会导致问题,因为 pydev 调试器服务器无法将文件的绝对路径与远程应用程序上的文件匹配,因此没有命中断点。

我不想硬编码 pydevd_file_utils.PATHS_FROM_ECLIPSE_TO_PYTHON 常量来启用文件路径转换。

您知道在不更改文件的情况下修改此值的方法吗?

谢谢!

【问题讨论】:

标签: python eclipse pydev


【解决方案1】:

路径转换有两种设置方式:

  1. 使用环境变量(例如PATHS_FROM_ECLIPSE_TO_PYTHON)将路径从客户端映射到服务器端。

该值是一个带有 list(list(str, str)) 的 json 字符串,例如:

PATHS_FROM_ECLIPSE_TO_PYTHON=[["c:/local/path", "/path/in/server"]]

请注意,您可以在任何您喜欢的位置设置环境变量(例如Python interpreter 首选项页面中的Environment 选项卡、操作系统本身、启动配置等)。

  1. 使用pydevd API 在运行时从 python 进程设置跟踪:
from pydevd_file_utils import setup_client_server_paths

MY_PATHS_FROM_ECLIPSE_TO_PYTHON = [
    ('/home/user/local-project', '/remote/path/to/project'),
]
setup_client_server_paths(MY_PATHS_FROM_ECLIPSE_TO_PYTHON)

# At this point we could connect to the remote debugger client with:
import pydevd
pydevd.settrace("10.0.0.12")

有关远程调试的更多信息,请参阅:https://www.pydev.org/manual_adv_remote_debugger.html

注意Window > Preferences select PyDev > Debug > Source Locator 中设置的映射并没有真正映射到该环境变量,也没有真正映射到调试器映射(这是一个单独的翻译,只翻译在Eclipse 本地,它并没有真正传递给调试器以远程命中断点)。

【讨论】:

  • 在 2018 年,使用最新的 pydev 和 eclipse,我使用了所有答案,但无论我如何尝试,当我从 windows eclipse 设置断点时,远程 Linux 终端总是显示:pydev调试器:警告:尝试向不存在的文件添加断点,然后添加当前目录+文件在我的Windows pc中的位置。所以它以“/root/project\C:eclipseproject\project”结尾,此刻我用完了选项..
  • import os os.environ['PATHS_FROM_ECLIPSE_TO_PYTHON'] = r'[["C:\\Users\\WindowsКириллица\\src", " /home/frost-nzcr4/dst"]]' print('Before settrace') import pydevd: pydevd.settrace('192.168.1.116', port=5678) print('After settrace') # 这里自动停止。 def main(): a = 5 # 在此处设置断点并停止。 return a + 5 print(main()) 此代码适用于: * 主机:Debian、Python 3.5、pydevd 1.3.0 * 来宾:Windows 7(在 VirtualBox 上)、Python 3.6、Eclipse 4.7.3a、Pydev 6.4.1
  • 遇到和君臣一样的问题后,frost评论里的代码就可以了!导入操作系统 os.environ['PATHS_FROM_ECLIPSE_TO_PYTHON'] = r'[["C:\\Users\\Ryan\\Documents\\4V_Projects\\4V_Firmware\\TestCode\\src", "/home/pi/src"] ]' print('Before settrace') import pydevd pydevd.settrace('10.0.0.7', port=5678) print('After settrace') # 这里自动停止。 def main(): a = 5 # 在此处设置断点并停止。 return a + 5 print(main())
  • 可以在描述中更清楚地说明应该配置的东西以及映射的方向是什么。还有一个真实配置的例子,例如linux/MacOS 或 Windows/Linux 之类的东西会很有帮助。目前我只能猜测这些方面。
  • 感谢 Fabio Zadrozny,他整合了 Emilio M. 和我自己的答案,并传播了关于 Eclipse 行为的信息。
【解决方案2】:

你可以像这样设置一个新的环境变量来做到这一点:

PATHS_FROM_ECLIPSE_TO_PYTHON='[["client_src_fullpath", "remote_src_fullpath"]]'

在 linux 中只需在从命令行启动程序之前运行它,或者设置为全局变量。

在 Windows 中,您需要将其设置为全局系统变量。

变量名:PATHS_FROM_ECLIPSE_TO_PYTHON

变量值:[["client_src_path", "remote_src_path"]]

作为替代方案,您也可以在代码中执行此操作,但您需要在导入 pydevd 之前执行此操作:

import os
os.environ.setdefault("PATHS_FROM_ECLIPSE_TO_PYTHON",'[["client_src_path","remote_src_path"]]')
import pydevd
pydevd.settrace("10.0.2.2", port=5678,stdoutToServer=True, stderrToServer=True, suspend=False,patch_multiprocessing=True)

(我知道这是一个非常古老的问题,但没有一个答案更新到当前代码)

【讨论】:

  • 感谢这个 - 它有时可以工作,但有一些可靠性问题。 dht suspend= 和 patch_multiprocessing 选项是什么意思?这些选项记录在哪里?
【解决方案3】:

不幸的是,没有好的方法可以做到这一点。 作为一种解决方法,我通过在源文件开头添加以下代码来显式替换函数 NormFileToServer。

def SrcPathMapping(file):
  eclipse_src_path = 'C:\\tmp\\workspace\\test\\Scripts\\'
  server_src_path  = '/home/tester/test/Scripts/'
  return file.replace(eclipse_src_path, server_src_path)

import pysrc.pydevd as pydevd  
pydevd.NormFileToServer = SrcPathMapping 

当所有源文件都位于一个目录中时,这种简单的映射就足够了。为了正确实现映射函数,请检查 pydevd_file_utils 中的 NormFileToServer。

【讨论】:

  • 那太复杂和过时了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-30
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
  • 2012-09-03
相关资源
最近更新 更多