【问题标题】:Pycharm not recognizing project packages after copying from old version of project从旧版本项目复制后,Pycharm 无法识别项目包
【发布时间】:2021-09-11 03:53:22
【问题描述】:

我正在尝试使用 pytest 为 repo 建立一个单元测试框架,并且我在一个旧分支中工作。我克隆了新分支并将文件复制到新分支。调用 pytest 时,测试可以正常运行,但它们引用的是旧项目中的文件(即使它们是作为当前项目中的包导入的,而不是通过直接文件路径)。

这是用于运行 pytest 的行/命令:

(venv) C:\Program Files\Python-3.8.2\pycharm_projects\fnma-erm01-devl-edl-hao-repo_21.3>python -m pytest

为了解决这个问题,我在本地删除了旧分支,现在所有测试都无法运行,并且它无法将任何项目目录识别为有效模块。

堆栈跟踪:

========================================================================================================================================================================= test session starts =========================================================================================================================================================================
platform win32 -- Python 3.8.2, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
rootdir: C:\Program Files\Python-3.8.2\pycharm_projects\ERM_EDL_HAO_21.3_Branch, configfile: pytest.ini
plugins: mock-3.5.1
collecting ... sys path ['
C:\\Program Files\\Python-3.8.2\\pycharm_projects\\ERM_EDL_HAO_21.3_Branch\\SourceCode\\application\\deploy\\app\\hao',
'C:\\Program Files\\Python-3.8.2\\pycharm_projects\\ERM_EDL_HAO_21.3_Branch',
'C:\\Progra~1\\Python-3.8.2\\pycharm_projects\\fnma-erm01-devl-edl-hao-repo\\SourceCode\\application\\deploy\\app\\hao\\lambda',
'C:\\Progra~1\\Python-3.8.2\\pycharm_projects\\fnma-erm01-devl-edl-hao-repo\\SourceCode\\application\\deploy\\app\\hao\\lambda\\tests',
'C:\\Progra~1\\Python-3.8.2\\pycharm_projects\\fnma-erm01-devl-edl-hao-repo\\SourceCode\\application\\deploy\\app\\hao\\lambda\\utils',
'C:\\Program Files\\Python-3.8.2\\pycharm_projects\\ERM_EDL_HAO_21.3_Branch',
'C:\\Program Files\\Python-3.8.2\\python38.zip',
'C:\\Program Files\\Python-3.8.2\\DLLs',
'C:\\Program Files\\Python-3.8.2\\lib',
'C:\\Program Files\\Python-3.8.2',
'C:\\Program Files\\Python-3.8.2\\pycharm_projects\\ERM_EDL_HAO_21.3_Branch\\venv',
'C:\\Program Files\\Python-3.8.2\\pycharm_projects\\ERM_EDL_HAO_21.3_Branch\\venv\\lib\\site-packages',
'C:\\Users\\g3uj2m\\AppData\\Roaming\\Python\\Python38\\site-packages',
'C:\\Users\\g3uj2m\\AppData\\Roaming\\Python\\Python38\\site-packages\\win32',
'C:\\Users\\g3uj2m\\AppData\\Roaming\\Python\\Python38\\site-packages\\win32\\lib',
'C:\\Users\\g3uj2m\\AppData\\Roaming\\Python\\Python38\\site-packages\\Pythonwin',
'C:\\Program Files\\Python-3.8.2\\lib\\site-packages']
collected 0 items / 16 errors  
=============================================================================================================================================================================== ERRORS ================================================================================================================================================================================
_______________________________________________________________________________________________________________________ ERROR collecting SourceCode/application/deploy/app/hao/lambda/tests/handlers/unittest_hao_amtm_upstream_notification.py _______________________________________________________________________________________________________________________
ImportError while importing test module 'C:\Program Files\Python-3.8.2\pycharm_projects\ERM_EDL_HAO_21.3_Branch\SourceCode\application\deploy\app\hao\lambda\tests\handlers\unittest_hao_amtm_upstream_notification.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
..\..\lib\importlib\__init__.py:127: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
SourceCode\application\deploy\app\hao\lambda\tests\handlers\unittest_hao_amtm_upstream_notification.py:8: in <module>
    from hao_amtm_upstream_notification import lambda_function
E   ModuleNotFoundError: No module named 'hao_amtm_upstream_notification'

# ... ^ that part more or less repeated 15 more times ...

======================================================================================================================================================================= short test summary info =======================================================================================================================================================================
ERROR SourceCode/application/deploy/app/hao/lambda/tests/handlers/unittest_hao_amtm_upstream_notification.py
ERROR SourceCode/application/deploy/app/hao/lambda/tests/handlers/unittest_hao_batchjob_status_check.py
ERROR SourceCode/application/deploy/app/hao/lambda/tests/handlers/unittest_hao_batchjob_submit.py
ERROR SourceCode/application/deploy/app/hao/lambda/tests/handlers/unittest_hao_capture_hedge_status.py
ERROR SourceCode/application/deploy/app/hao/lambda/tests/handlers/unittest_hao_ccfa_upstream_notification.py
ERROR SourceCode/application/deploy/app/hao/lambda/tests/handlers/unittest_hao_dynamodb_status_check.py
ERROR SourceCode/application/deploy/app/hao/lambda/tests/handlers/unittest_hao_glue_function.py
ERROR SourceCode/application/deploy/app/hao/lambda/tests/handlers/unittest_hao_irdb_upstream_notification.py
ERROR SourceCode/application/deploy/app/hao/lambda/tests/handlers/unittest_hao_krd_upstream_notification.py
ERROR SourceCode/application/deploy/app/hao/lambda/tests/handlers/unittest_hao_ln_pool_max.py
ERROR SourceCode/application/deploy/app/hao/lambda/tests/handlers/unittest_hao_s3_data_availability_check.py
ERROR SourceCode/application/deploy/app/hao/lambda/tests/handlers/unittest_hao_stepfn_execution_status.py
ERROR SourceCode/application/deploy/app/hao/lambda/tests/handlers/unittest_hao_swap_upstream_notification.py
ERROR SourceCode/application/deploy/app/hao/lambda/tests/handlers/unittest_hao_trigger_sns_msg.py
ERROR SourceCode/application/deploy/app/hao/lambda/tests/handlers/unittest_hao_verify_upstream_data_availability.py
ERROR SourceCode/application/deploy/app/hao/lambda/tests/handlers/unittest_hao_workflow_trigger.py

文件树:

pytest.ini

SOURCECODE
├───application
│   └───deploy
│       └───app
│           └───hao
│               ├───lambda
│               │   ├───hao_amtm_upstream_notification
│               │   │       lambda_function.py
│               │   │
│               │   ├───hao_batchjob_status_check
│               │   │       lambda_function.py
│               │   │
│               │   ├───hao_batchjob_submit
│               │   │       lambda_function.py
│               │   │
                  ... etc ...
│               │   │
│               │   ├───tests
│               │   │   conftest.py
│               │   │
│               │   │   ├───handlers
│               │   │   │       unittest_hao_amtm_upstream_notification.py
│               │   │   │       unittest_hao_batchjob_status_check.py
│               │   │   │       unittest_hao_batchjob_submit.py
│               │   │   │     ... etc ...

pytest.ini 文件:

# pytest.ini
[pytest]
python_files = unittest_*.py

这是我已经尝试/检查过的:

  1. 所有必要的文件夹都已标记为“Sources Root”。
  2. 我已将__init__.py 添加到所有必要的文件夹中。
  3. 我已检查以确保 __init__.py 未被识别为文本文件。
  4. 我已经在文件下运行了“使缓存无效/重新启动...”选项。
  5. 我已确保项目的解释器与当前项目和目录保持一致。

它不会让我包含屏幕截图,但项目结构应该不是问题,因为它在旧分支中运行良好。 (旧的分支结构和新的一样,所以从一个复制到另一个应该没有引用问题)

编辑 1: 我正在使用pytest.ini 配置文件,其中指定的唯一内容是用于标识测试文件的自定义前缀。我为新项目创建了一个新的 venv,并且我正在从 PyCharm 的内置终端调用 pytest,因此 venv 处于活动状态。

编辑 2: 缩短了堆栈跟踪,使其更易于阅读,并添加了文件树和pytest.ini 文件的相关部分。

【问题讨论】:

  • @bad_coder 我正在使用 pytest.ini 配置文件,其中唯一指定的是用于标识测试文件的自定义前缀。我为新项目创建了一个新的 venv,并且我正在从 pycharm 的内置终端调用 pytest,因此 venv 处于活动状态。
  • @bad_coder 正在发现测试。这是行/命令:(venv) C:\Program Files\Python-3.8.2\pycharm_projects\fnma-erm01-devl-edl-hao-repo_21.3&gt;python -m pytest。它成功地找到并尝试运行所有 16 个测试,但无论出于何种原因,对项目中模块的引用都被破坏了。虚拟环境 (venv) 处于活动状态。对于项目解释器,我选择了虚拟环境,但这确实让我怀疑将它放在 Python 主文件夹中是否会导致问题。希望不是因为它必须因为权限而存在。
  • 我在文件树和pytest.ini文件的相关部分添加了
  • 好的,我想我发现了错误。在您的sys.path 中查看'C:\\Progra~1\\Python-3.8.2\\pycharm_projects\\fnma-erm01-devl-edl-hao-repo\\SourceCode\\application\\deploy\\app\\hao\\lambda' 。这就是发生 1 条错误消息的地方,这是一条 from hao_amtm_upstream_notification import lambda_function。现在,问题似乎是您的sys.path 中有lambda 包用于fnma-erm01-devl-edl-hao-repo 分支,但不是ERM_EDL_HAO_21.3_Branch 如果您像您一样将相同的包放在sys.path 上的后续分支对于前者,它应该可以工作。
  • 'C:\\Program Files\\Python-3.8.2\\pycharm_projects\\ERM_EDL_HAO_21.3_Branch\\SourceCode\\application\\deploy\\app\\hao\\lambda' 添加到sys.path 中应该少1 个“未找到”导入错误。基本上,您需要复制与 fnma-erm01-devl-edl-hao-repo 相同的路径并将它们放在 sys.path 上。

标签: python pycharm pytest


【解决方案1】:

好的,在复制到新项目后,Pycharm 似乎无法检测到源根目录的变化,因为除了项目名称之外,路径是相同的。奇怪的是,如果我创建一个测试配置并通过 Pycharm 的内置 pytest 运行程序运行,它就可以工作。话虽如此,我无法让控制台使用正确的 PYTHONPATH,但我找到了一种解决方法。我没有通过控制台使用 python -m pytest 调用 pytest,而是创建了一个强制 PYTHONPATH 更新的脚本。

新命令:

python run_unittests.py

新脚本:

import pytest, os, sys

project_dir = os.path.dirname(os.path.abspath(__file__))
base_test_dir = os.path.join(project_dir, 'SourceCode', 'application', 'deploy', 'app', 'hao', 'lambda')

test_dirs = [
    os.path.join(base_test_dir, 'tests'),
    os.path.join(base_test_dir, 'handlers'),
    os.path.join(base_test_dir, 'utils'),
    base_test_dir
]

for i in test_dirs:
    if i not in sys.path:
        sys.path.append(i)

test_args = [a for a in sys.argv if a != 'run_unittests.py']

pytest.main([base_test_dir]+test_args)

感谢@bad_coder 的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 2016-11-15
    • 2021-07-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多