有没有办法在不修改文件的情况下修改pydevd_file_utils.PATHS_FROM_ECLIPSE_TO_PYTHON的值?

3 投票
3 回答
2527 浏览
提问于 2025-04-17 05:35

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

这个远程应用程序的文件结构和我运行Eclipse的地方的文件结构不一样。这就导致了一个问题:当我在Eclipse IDE中设置断点时,pydev调试服务器无法将文件的绝对路径与远程应用程序中的文件匹配,因此断点无法被触发。

我不想直接在代码里写死pydevd_file_utils.PATHS_FROM_ECLIPSE_TO_PYTHON这个常量来实现文件路径的转换。

你知道有什么方法可以在不修改文件的情况下来改变这个值吗?

谢谢!

3 个回答

-1

很遗憾,目前没有好的方法来做到这一点。
作为一个解决办法,我在我的源文件开头加了以下代码,明确地替换了函数 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。

3

你可以通过设置一个新的环境变量来实现这个功能,方法如下:

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)

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

7

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

  1. 使用一个环境变量,比如 PATHS_FROM_ECLIPSE_TO_PYTHON,这个变量可以把客户端的路径映射到服务器端。

这个变量的值是一个 JSON 字符串,格式是 list(list(str, str)),意思是:

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

你可以在任何地方设置这个环境变量,比如在 Python 解释器环境 标签页、操作系统本身、启动配置等地方。

  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

注意:在 窗口 > 偏好设置 中选择 PyDev > 调试 > 源定位器 设置的映射,并不等同于那个环境变量,也不是实际调试器的映射(这只是一个单独的转换,只会转换在 Eclipse 本地找到的路径,而不会传递给调试器以便远程触发断点)。

撰写回答