subprocess.run 不会按预期执行 pytest 命令,在操作工作流程中它不会添加/考虑 cli 参数

问题描述 投票:0回答:1

基本工作示例:

操作工作流程:

name: Manual_Run

on:
  workflow_dispatch:
    inputs:
      mark:
        description: 'Which tests are executed'
        default: ''
        required: false
        type: string

  workflow_call:
    inputs:
      env:
        description: 'Environment on which the tests are executed'
        default: 'Prod'
        required: true
        type: string

permissions:
  id-token: write
  contents: read

jobs:

  build:

    runs-on: ubuntu-latest

    env:
      INPUT_MARK: ${{ github.event.inputs.mark }}

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Setup python 3.10
      uses: actions/setup-python@v5
      with:
        python-version: '3.10'
        cache: 'pip'

    - name: Install python requirements
      run: pip install -r requirements.txt
    - name: Run Pytest
      run: python run_tests.py

run_tests.py 是

import subprocess



if __name__ == "__main__":
    cmd = ['pytest', '-m', 'sum']
    subprocess.Popen(cmd, text=True, shell=True)

有针对性的测试(存储库中唯一的测试,test_feats.py)

import pytest


@pytest.mark.sum
def test_sum():
    assert 1 + 1 == 2

@pytest.mark.minus
def test_minus():
    assert 1 - 1 == 0

如果我在 Windows 操作系统上本地运行 run_tests.py,一切都会按预期工作:

collected 2 items / 1 deselected / 1 selected
.
.
.
================= 1 passed, 1 deselected, 2 warnings in 0.15s =================

但是在远程/操作工作流程/ ubuntu 最新操作系统上:

collected 2 items
.
.
.
======================== 2 passed, 2 warnings in 0.03s =========================

如果有人知道为什么会发生这种情况,请帮我一把,我合法地完成了我能找到的所有内容,但没有任何合乎逻辑的理由让它表现得如此

python linux subprocess pytest github-actions
1个回答
0
投票

问题与 Windows 和 Posix 上对

subprocess.Popen
参数的不同处理有关(如果您使用
shell=True
)。

来自文档

在 shell=True 的 POSIX 上,shell 默认为 /bin/sh。如果 args 是字符串,则该字符串指定要通过 shell 执行的命令。这意味着字符串的格式必须与在 shell 提示符下键入时完全相同。例如,这包括引用或反斜杠转义其中包含空格的文件名。如果 args 是一个序列,则第一项指定命令字符串,任何其他项将被视为 shell 本身的附加参数。也就是说,Popen 所做的相当于:

Popen(['/bin/sh', '-c', args[0], args[1], ...])

这意味着您要么不应该使用

shell=False
(这是默认值),或者,如果您出于某种原因需要它,则需要在 Windows 和 Posix 中以不同的方式处理它:

import sys

if __name__ == "__main__":
    cmd = ['pytest', '-m', 'sum']
    if sys.platform != "win32":
        cmd = [" ".join(cmd)]
    subprocess.Popen(cmd, text=True, shell=True)
© www.soinside.com 2019 - 2024. All rights reserved.