【问题标题】:How do you set up Pycharm to debug a Fabric fabfile on Windows?如何设置 Pycharm 以在 Windows 上调试 Fabric fabfile?
【发布时间】:2014-05-18 22:48:42
【问题描述】:

是否可以设置 Pycharm 以单步执行 Fabric fabfile.py?

使用运行/调试配置编辑器似乎可以做到这一点,但我似乎无法正确设置设置。编辑器要求运行脚本,我已经尝试了 fab-script.py 文件,它只是为我提供了 fab 帮助选项。

似乎我很接近但并不完全在那里。

【问题讨论】:

标签: python debugging pycharm fabric


【解决方案1】:

这是我最终设置的方式,以防这对其他人有用。与大多数类似的事情一样,一旦您了解了魔术设置,就很容易了。所有这些指令都是通过 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 需要可从命令行执行 - 通过将其放在环境变量路径属性中)

【讨论】:

  • 在 linux 中尝试,脚本:/usr/local/bin/fab 如果您在 virtualenv 中,请获取它并使用 which fab 的输出
【解决方案2】:

我按照以上屏幕截图中的说明进行操作。请注意上面的 fab-script 应该包含:

import fabric.main

if __name__ == '__main__':
    fabric.main.main()

【讨论】:

    【解决方案3】:

    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/调试器方法要好得多。

    【讨论】:

      【解决方案4】:

      对于 fabric2(2.5) 将这些代码添加到 fabfile.py 并将其作为 python 脚本进行调试:

      if __name__ == '__main__':
          from fabric.main import make_program
          make_program().run("fab [your_task]"
      

      【讨论】:

        猜你喜欢
        • 2013-10-10
        • 2019-03-22
        • 1970-01-01
        • 2020-10-27
        • 1970-01-01
        • 1970-01-01
        • 2014-02-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多