【发布时间】:2014-05-18 22:48:42
【问题描述】:
是否可以设置 Pycharm 以单步执行 Fabric fabfile.py?
使用运行/调试配置编辑器似乎可以做到这一点,但我似乎无法正确设置设置。编辑器要求运行脚本,我已经尝试了 fab-script.py 文件,它只是为我提供了 fab 帮助选项。
似乎我很接近但并不完全在那里。
【问题讨论】:
标签: python debugging pycharm fabric
是否可以设置 Pycharm 以单步执行 Fabric fabfile.py?
使用运行/调试配置编辑器似乎可以做到这一点,但我似乎无法正确设置设置。编辑器要求运行脚本,我已经尝试了 fab-script.py 文件,它只是为我提供了 fab 帮助选项。
似乎我很接近但并不完全在那里。
【问题讨论】:
标签: python debugging pycharm fabric
这是我最终设置的方式,以防这对其他人有用。与大多数类似的事情一样,一旦您了解了魔术设置,就很容易了。所有这些指令都是通过 PyCharm 完成的,但其中一些指令可以通过其他方式完成。但是,由于这是关于在 PyCharm 中进行调试的,所以这就是我用于说明的内容。另外,我使用的是 Windows。
将 Fabric 包安装到项目环境中(使用 Settings-->Project Interpreter 包安装)。这会将 Fabric 安装到虚拟环境的站点包文件夹中,并将 fab.exe 和 fab-script.py 文件放在 /Scripts 文件夹中。找到 fab-scripts.py 文件的位置并复制路径(类似于“C:\\Scripts\fab-script.py”)
现在,使用此脚本文件名创建一个运行配置(运行 --> 编辑配置... --> Python)。 Script 参数指向 fabfile.py 和执行/调试的命令。脚本参数是: -f fabfile dev:"MyBranch1" deploy 这允许我使用“MyBranch1”参数调试“dev”任务,然后运行“deploy”任务。将 dev:"MyBranch1" deploy 替换为您的任务名称。工作目录指向您的项目文件夹,该文件夹也是 fabfile.py 所在的位置(至少在我的配置中)。我的设置如下所示。
打开 fabfile.py 并在您想要停止调试器的位置放置一个断点。在这种情况下,由于我正在调试部署任务,因此我将断点放在那里。
现在调试 fab 运行,将活动配置设置为刚刚创建的配置,然后单击调试。
当断点被命中时,你就关闭并使用 PyCharm 调试你的 fabric fabfile.py
当您准备好运行调试的 fabfile 时,打开终端并使用调试中使用的参数运行 fab 命令。再次,将命令提示符指向项目(工作)目录。 (注意:Scripts 文件夹中的 fab.exe 需要可从命令行执行 - 通过将其放在环境变量路径属性中)
【讨论】:
/usr/local/bin/fab 如果您在 virtualenv 中,请获取它并使用 which fab 的输出
我按照以上屏幕截图中的说明进行操作。请注意上面的 fab-script 应该包含:
import fabric.main
if __name__ == '__main__':
fabric.main.main()
【讨论】:
fab 可执行文件只不过是一个简单的 python 脚本。例如,使用 Fabric 1.10.2 就是这样(虽然我跳过了 shebang 和编码行):
import re
import sys
from fabric.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
ie:它所做的只是调用fabric.main.main()。我不确定它为什么要替换sys.argv[0] 中的 Windows 扩展,但这并不重要。
如果你想调试一个fabfile,要么将fab.py文件设置为你的IDE调试的脚本,要么创建一个调用fabric的main()的小存根文件并调试它。然后,您可以将断点放在您的 fabfile(或您的 fabfile 导入的任何内容)中的任何位置,就像使用任何其他 python 程序一样。
除此之外,您需要的主要部分是能够将参数传递给已执行的脚本,以便它们显示在sys.argv 中。如何执行此操作取决于您的 IDE/调试器。或者,你可以自己把它们塞进去,像这样:
import sys
from fabric.main import main
sys.argv[1:] = ["task1",."task2"] #or whatever you would give fab.
main()
当然,使用您的 IDE/调试器方法要好得多。
【讨论】:
对于 fabric2(2.5) 将这些代码添加到 fabfile.py 并将其作为 python 脚本进行调试:
if __name__ == '__main__':
from fabric.main import make_program
make_program().run("fab [your_task]"
【讨论】: