如何从 Gradle 激活虚拟环境?

How do you activate a virtual environment from Gradle?

我的 gradle.build 文件中有以下 exec 命令。

exec {
        workingDir System.getProperty("user.dir")
        commandLine 'python3.6', 'buildscript.py'
    }
exec {
    workingDir System.getProperty("user.dir")
    commandLine 'python3.6', '-m', 'virtualenv', 'env'
}


exec {
    workingDir System.getProperty("user.dir")
    commandLine 'source', 'env/bin/activate'
}

exec {
    workingDir System.getProperty("user.dir")
    commandLine 'pip3.6', 'install', 'pybuilder'
}

exec {
    workingDir System.getProperty("user.dir")
    commandLine 'pyb', '-E', 'env', '-X'
}

这些都在执行 gradle 构建时 运行 的构建任务中。 从理论上讲,这应该 运行 我创建的一个脚本,它创建了构建我的 python 程序所需的所有文件,然后它应该创建一个虚拟环境,激活它,安装 pybuilder,然后 运行 pybuilder。但是,命令:

exec {
        workingDir System.getProperty("user.dir")
        commandLine 'source', 'env/bin/activate'
    }

似乎失败了。它声称 directory/file 不存在,尽管它通过命令行工作。我不确定为什么会这样。这样做的重点是强制 Pybuilder 将我的程序依赖项安装到我创建的虚拟环境中。 pyb -E env 在技术上应该为我激活虚拟环境,但无论出于何种原因,它都没有将我的依赖项安装到该虚拟环境。在我们的 Jenkins 节点上,这是一个问题,因为我们不希望在全局安装这些,更不用说,我反正没有 root 用户权限。

任何帮助将不胜感激。如果您知道另一种让 Pybuilder 正常工作的方法,那同样很好。

临时解决方案:我最终创建了一个小 shell 脚本来创建和激活虚拟环境。然后我从 gradle.

执行了那个脚本

activate 上调用 source 只是在做 shell 连接变量的魔法。您不需要总是调用 activate(在这种情况下可能不能)。相反,您应该在 pip3.6pyb 命令前加上 env/bin 以直接调用二进制文件。因此,它将是

exec {
   workingDir System.getProperty("user.dir")
   commandLine 'env/bin/pip3.6', 'install', 'pybuilder'
}

exec {
   workingDir System.getProperty("user.dir")
   commandLine 'env/bin/pyb', '-E', 'env', '-X'
}

首先你应该像这样创建你的环境。所以你的环境会创造

exec {
    workingDir System.getProperty("user.dir")
    commandLine 'python', '-m', 'virtualenv', 'env'
}

现在您应该激活您的环境并执行命令(例如 PyBuilder)

对于Windows:

exec {
    workingDir System.getProperty("user.dir")
    commandLine 'cmd','activate','env','&&','pip','install','pybuilder'
}

对于Shell:

exec {
        workingDir System.getProperty("user.dir")
        commandLine 'source','env/bin/activate','env','&&','pip','install','pybuilder'
    }