通过按名称调用它来执行独立的结构脚本,不带 .py 扩展名

executing standalone fabric script by calling it by its name, without the .py extension

我有一个名为 fwp.py 的结构脚本,我 运行 没有通过 fab 使用以下方法调用它:

if __name__ == '__main__':
    # imports for standalone mode only
    import sys
    import fabric.main

    fabric.main.main(fabfile_locations=[__file__])

然后必须通过调用 fwp.py 来调用脚本。我想将其重命名为 fwp,以便能够将其称为 fwp。但这样做会导致

Fatal error: Couldn't find any fabfiles!

有没有办法使 Python/Fabric 导入此文件,尽管缺少“.py”扩展名?

重申和澄清:

我没有使用 "fab" 实用程序(例如 fab task task:parameter);只是将我的脚本称为 fwp.py task task:parameter,并希望能够将其称为 fwp task task:parameter.

更新

这不是 this question 的副本。问题不是 "How to run a stand-alone fabric script?",而是 "How to do so, while having a script without a .py" 扩展。

编辑:已更正原始答案

fabric.main.main() 函数自动将 .py 添加到提供的 fabfile 位置的末尾(参见 https://github.com/fabric/fabric/blob/master/fabric/main.py#L93)。不幸的是,该函数还使用 Python 的导入机制来加载文件,因此它必须看起来像一个模块或包。如果不重新实现 fabric.main 模块的大部分内容,我认为这是不可能的。您可以尝试对 fabric.main.find_fabfilesfabric.main.load_fabfiles 进行猴子修补以使其工作。

原答案(错误)

我可以让它在新安装的结构包上正常工作。以下将以文件名 fwp 和版本 1.10.1、Python2.7 的可执行权限执行。我只想尝试升级面料。

#!/usr/bin/env python

from fabric.api import *
import fabric.main

def do():
    local('echo "Hello World"')

if __name__ == '__main__':
    fabric.main.main(fabfile_locations=[__file__])

输出:

$ ./fwp do
Hello World

Done