有没有办法在不修改文件的情况下修改pydevd_file_utils.PATHS_FROM_ECLIPSE_TO_PYTHON的值?
我正在使用pydev插件来调试一个远程应用程序。
这个远程应用程序的文件结构和我运行Eclipse的地方的文件结构不一样。这就导致了一个问题:当我在Eclipse IDE中设置断点时,pydev调试服务器无法将文件的绝对路径与远程应用程序中的文件匹配,因此断点无法被触发。
我不想直接在代码里写死pydevd_file_utils.PATHS_FROM_ECLIPSE_TO_PYTHON这个常量来实现文件路径的转换。
你知道有什么方法可以在不修改文件的情况下来改变这个值吗?
谢谢!
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。
你可以通过设置一个新的环境变量来实现这个功能,方法如下:
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)
(我知道这个问题很老,但没有一个答案更新到当前的代码)
设置路径转换有两种方法:
- 使用一个环境变量,比如
PATHS_FROM_ECLIPSE_TO_PYTHON
,这个变量可以把客户端的路径映射到服务器端。
这个变量的值是一个 JSON 字符串,格式是 list(list(str, str))
,意思是:
PATHS_FROM_ECLIPSE_TO_PYTHON=[["c:/local/path", "/path/in/server"]]
你可以在任何地方设置这个环境变量,比如在 Python 解释器
的 环境
标签页、操作系统本身、启动配置等地方。
- 使用
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 本地找到的路径,而不会传递给调试器以便远程触发断点)。