Intellij/Pycharm 无法调试 Python 模块
Posted
技术标签:
【中文标题】Intellij/Pycharm 无法调试 Python 模块【英文标题】:Intellij/Pycharm can't debug Python modules 【发布时间】:2015-05-11 09:46:00 【问题描述】:我使用 PyCharm/IntelliJ 社区版本来编写和调试 Python 脚本,但现在我正在尝试调试 Python 模块,而 PyCharm 做了错误的命令行指令解析,导致执行错误,或者我的配置错误。
这是我的运行/调试配置:
这是在我运行模块时执行的(这里没有问题):
/usr/bin/python3.4 -m histraw
但是当我调试时,这是 IntelliJ 控制台中的输出:
/usr/bin/python3.4 -m /opt/apps/pycharm/helpers/pydev/pydevd.py --multiproc --client 127.0.0.1 --port 57851 --file histraw
/usr/bin/python3.4: Error while finding spec for '/opt/apps/pycharm/helpers/pydev/pydevd.py' (<class 'ImportError'>: No module named '/opt/apps/pycharm/helpers/pydev/pydevd')
Process finished with exit code 1
如您所见,参数解析错误,在-m
选项之后,在模块名称之前传递了一个 IntelliJ 调试脚本。
我也试过把-m histraw
放在Script字段中,但不起作用,那个字段只是放Python脚本路径,而不是模块。
有什么想法吗?
【问题讨论】:
您到底想通过使用 -m 参数而不是直接运行脚本来实现什么?据我了解, -m 开关旨在使运行标准库模块变得容易;它对您自己的脚本没有任何好处。 因为我正在编写一个可分发的命令行脚本,它可以作为可执行命令行工具安装在您的系统PATH
中,带有setuptools 和pip 工具。当您在 Python 中编写真正的命令行时,setuptools
使用新的独立脚本将其安装在您的系统环境中,并且此脚本将您的原始脚本作为模块调用。这在代码运行时可能看起来无害,但实际上并非如此,因为“环境”发生了变化,并且代码的某些部分可能会做出不同的反应,特别是模块导入语句或对 sys.* 包的调用等。跨度>
那么为什么不创建一个 setuptools 将创建的脚本的副本,然后从 PyCharm 运行配置中运行该脚本呢?
也许可行,但它是任何 IDE 的基本要求,即无需更改程序运行方式即可运行和调试程序的能力。此外,将这个功能添加到 PyCharm 看起来非常简单,就像在调试时更改执行参数顺序一样。无论如何,谢谢,我会尽快测试你的“hack”。
修复 PyCharm 确实没有什么难的。但是,在任何情况下,找到让您继续工作的解决方法比发布包含修复程序的更新版本的 PyCharm 更快。
【参考方案1】:
还有另一种方法可以让它工作。你可以编写一个 python 脚本来运行你的模块。然后只需配置 PyCharm 来运行这个脚本。
import sys
import os
import runpy
path = os.path.dirname(sys.modules[__name__].__file__)
path = os.path.join(path, '..')
sys.path.insert(0, path)
runpy.run_module('<your module name>', run_name="__main__",alter_sys=True)
然后调试器工作。
【讨论】:
这很好用,根据您的项目布局和工作目录设置,甚至不需要修改 sys.path。 如何以及在何处配置 PyCharm 以运行此脚本? [运行 -> 编辑配置] 脚本:上面的脚本。脚本参数:除“-m module_name”之外的所有原始参数。 这应该被标记为正确的响应;这很简单,它可以工作我已经用机器人模块对其进行了测试,这是很长一段时间以来我第一次能够调试【参考方案2】:在 PyCharm 2019.1(专业版)中,我可以在配置下选择 run as module 选项,如下所示
【讨论】:
是的,该公司声称自 PyCharm 4.5.2 以来已经解决了它(没有解释如何,只是将问题标记为已解决),但实际上我看到自 PyCharm 2018 以来问题已解决,并且可用在两个版本中:社区和专业【参考方案3】:我发现创建一个包含以下内容的引导文件 (debuglaunch.py) 是最简单的方法。
from package import file with __main__
if __name__ == '__main__':
file with __main__.main()
例如,为了在 pycharm 调试器中启动 locustio,我这样创建了 debuglaunch.py:
from locust import main
if __name__ == '__main__':
main.main()
并配置pycharm如下。
注意:我发现我无法进入调试器,除非我在 main.main() 上添加断点。然而,这可能是 locustio 特有的。
【讨论】:
【参考方案4】:自 PyCharm 4.5.2 以来,该问题已得到修复。请参阅 PyCharm 跟踪器中的相应问题: https://youtrack.jetbrains.com/issue/PY-15230
【讨论】:
如果您不评论或记录如何使用新功能,就好像该功能不存在。这就是那个修复的情况,我再次尝试使用 PayCharm 4.5.3,我遇到了同样的问题,但我不确定是因为问题没有解决,还是因为有一个新的特殊功能可以调试 Python模块,但没有记录该功能以了解如何使用它。 此外,这里提到的链接指向已重新打开的票;所以问题没有解决。以上是关于Intellij/Pycharm 无法调试 Python 模块的主要内容,如果未能解决你的问题,请参考以下文章
JetBrains IDE(WebStorm、IntelliJ、Pycharm 等)没有为 Bitbucket 保存密码
如何在 Intellij / PyCharm 中交换拆分器窗口