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 导入取决于脚本的来源 运行。
因此,要么删除 PYTHONPATH 或 import
中的 \src
之前问过类似的问题,我标记为已回答,还有其他信息。
结构如下:
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_countersPython 导入取决于脚本的来源 运行。 因此,要么删除 PYTHONPATH 或 import
中的 \src