如何在 Github Action 中激活虚拟环境?

5

我习惯使用虚拟环境。但是由于某些原因,我无法在 GitHub Action 作业中激活虚拟环境。

为了调试,我添加了以下步骤:

      - name: Activate virtualenv
        run: |
          echo $PATH
          . .venv/bin/activate
          ls /home/runner/work/<APP>/<APP>/.venv/bin
          echo $PATH

我可以看到操作日志。
/opt/hostedtoolcache/Python/3.9.13/x64/bin:/opt/hostedtoolcache/Python/3.9.13/x64:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[...]  # Cut here because a lot of lines are displayed. My executables are present including the one I'm trying to execute : pre-commit.
/home/runner/work/<APP>/<APP>/.venv/bin:/opt/hostedtoolcache/Python/3.9.13/x64/bin:/opt/hostedtoolcache/Python/3.9.13/x64:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

所以它应该能够工作...
但下一步是:
      - name: Linters
        run: pre-commit

生成错误日志

Run pre-commit
  pre-commit
  shell: /usr/bin/bash -e {0}
  env:
    [...]  # private
/home/runner/work/_temp/8e893c8d-5032-4dbb-8a15-59be68cb0f5d.sh: line 1: pre-commit: command not found
Error: Process completed with exit code 127.

如果我按照以下方式转换上面的步骤,我没有任何问题:

      - name: Linters
        run: .venv/bin/pre-commit

由于某些原因,Bash无法找到我的可执行文件,尽管包含它的文件夹已在$PATH中引用。
1个回答

8
我相信您知道激活虚拟环境并不是魔术,它只是在$PATH前面添加了…/.venv/bin/。现在,在Github Action中问题在于每个run都由不同的shell执行,因此每个run都有一个默认的PATH,就好像虚拟环境被停用了一样。
我看到有三种方法可以克服这个问题。第一种是您已经提到的——只需使用.venv/bin/<command>
第二种方法是在每个步骤中激活虚拟环境:
- name: Linters
  run: |
    . .venv/bin/activate
    pre-commit

第三步是:激活它一次并将$PATH存储在一个文件中,Actions会在每个步骤中使用该文件来恢复环境变量。该文件在文档中有描述。
因此,您的整个工作流应该如下所示:
- name: Activate virtualenv
  run: |
    . .venv/bin/activate
    echo PATH=$PATH >> $GITHUB_ENV

- name: Linters
  run: pre-commit

1
很好的解释根本原因。使用 venv-run 可以简化很多 https://github.com/guludo/venv-run,或者切换到其他虚拟环境选项,如具有本地 conda runpipenv run 的 Conda/Pipenv。 - Lex Li
“我相信你知道激活虚拟环境并不是魔法 - 它只是在 $PATH 前面添加了 .../.venv/bin/。” 不仅如此,它还设置了 VIRTUAL_ENV,在某些情况下会被使用。它还创建了一个 deactivate 命令以供稍后使用,尽管在 CI 上下文中这个命令不太有用。 - Philip Couling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接