Python 导入 main() 问题 - 模块存在,在 PyCharm 中工作,Gitlab 说未找到

Python importing main() problem - module exists, works in PyCharm, Gitlab says not found

之前问过类似的问题,我标记为已回答,还有其他信息。

结构如下:

engine-load-tests\
    |-src\
        |- __init__.py
        |- main.py
            |- on_locust_init()
        |
        |- win_perf_counters
                |- __init__.py
                |- main.py
                    |- main([])
    |- __init__.py
    |- .gitlab-ci.yml
engine-load-tests\src\main.py:

    import src.win_perf_counters.main as wmi_counters

...
    def on_locust_init():
        pid = wmi_counters.main([conf_file, database])
也尝试过...
    from src.win_perf_counters.main import main
...
    pid = main([conf_file, database])
win_perf_counters:
    class WinPerf:
        def x:
            ...
        def y:
            ...

    def main(args):
        // code

    if __name__ == "__main__":
        import sys

        main(sys.argv[1:])

这可能不是很好的形式,但它过去一直有效,并且当我在 PyCharm 中 运行 时它继续有效。

当我在 Gitlab 运行 中 CI 时,我得到:

  File "C:\GitLab-Runner\builds\eTJPJvW5[=16=]\qa\engine-automation\engine-load-tests\src\main.py", line 14, in <module>
    import src.win_perf_counters.main as wmi_counters
ModuleNotFoundError: No module named 'src.win_perf_counters.main'

我已经花了一整天阅读 Python文档,但我仍然没有看到我遗漏了什么。

我在 CI YML set PYTHONPATH=%PYTHONPATH%:. 中有一行,但这没有帮助。

我认为,如果我的 import 存在根本性缺陷,那么 PyCharm 也应该会失败。

我想知道这是否与我试图包含 main.

的事实有关

更好的建议 Python 欢迎并赞赏设计。

也适用于 DOS 命令行。

Gitlab YAML

(我知道将其设为 Docker 图像而不是每次都 运行 宁 pip 会快得多。)

test:
  before_script:
    - python -V
    - pip install virtualenv
    - virtualenv venv
    - .\venv\Scripts\activate.ps1
    - refreshenv
    - python -m pip install --upgrade pip
    - python -m pip install locust
    - locust -V
    - python -m pip install multipledispatch
    - python -m pip install pycryptodome
    - python -m pip install pandas
    - python -m pip install wmi
    - python -m pip install pywin32
    - python -m pip install influxdb_client    
  script:
  - set LOAD_TEST_CONF=load_test.conf
  - set PYTHONPATH=%PYTHONPATH%:%CI_PROJECT_DIR%\src
  - echo "**** about to run locust ******"
  - locust -f ./src/main.py --host $TARGET_HOST -u $USERS -t $TEST_DURATION -r $RAMPUP -s 1800 --headless --csv=./LoadTestsData_VPOS --csv-full-history --html=./LoadTestsReport_VPOS.html  --stream-file ./data/stream_jsons/streams_vpos.json --database=csv
  
  - Start-Sleep -s $SLEEP_TIME

  variables:
    LOAD_TEST_CONF: load_test.conf
    PYTHON_VERSION: 3.8.0
    TARGET_HOST: http://x.x.x.x:9000

  tags:
    - win2019
  artifacts:
    paths:
      - ./LoadTests*
      - public
  only:
    - schedules

  after_script:
    - mkdir .public
    - cp -r ./LoadTests* .public 
    - cp metrics.csv .public -ErrorAction SilentlyContinue
    - mv .public/* public

既然你在做

set PYTHONPATH=%PYTHONPATH%:%CI_PROJECT_DIR%\src

它将尝试从 /src 执行。 你也在做

src.win_perf_counters.main as wmi_counters

所以你要在 /src/src/

中寻找 wmi_counters

Python 导入取决于脚本的来源 运行。 因此,要么删除 PYTHONPATHimport

中的 \src