繁体   English   中英

Python 在测试目录中导入

[英]Python Imports in test directory

首先,我知道这个问题已经被问了 1000 次,但我似乎找不到一个有效的答案,如果这是重复的话,很抱歉,如果你知道一个可以回答这个问题的问题,请分享。

我有以下目录结构:

my_app_dir
    ├── my_app
    │   ├── __init__.py
    │   ├── main.py
    │   ├── services
    │   │   ├── __init__.py
    │   │   └── my_service.py
    │   └── objects
    └── testing
        ├── service_tests
        │   ├── __init__.py
        │   └── test_my_service.py
        └── __init__.py

我试图将 my_service 从./my_app_dir/my_app/services/my_service.py 导入我的测试用例 class test_my_service.py in./my_app_dir/testing/service_tests/my_service.py

我试图像这样在我的模块中导入它:

import unittest
from my_app.services.my_service import MyService

class MyTest(unittest.TestCase):
   ...


我收到一个错误:无法导入模块 my_app...

这里的转折是我试图在带有调试的 VS 代码中运行它。 我有以下launch.json:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "cwd": "${workspaceFolder}"
        }
    ]
}

我确实尝试在 launch.json 中添加到 PYTHONPATH,如下所示:

"env":{
   "PYTHONPATH":"${PYTHONPATH}C:my_app_dir\\my_app"
} 

这个测试代码需要移植到其他机器上,所以我真的不想修改 sys 路径。

我如何导入模块和/或我使用的目录结构有问题吗?

谢谢!

我不确定为什么修改sys.path会降低可移植性:

# my_app_dir/testing/service_tests/my_service.py

import sys, os
initial_sys_path = sys.path.copy()

PATH_TO_MYAPPDIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
sys.path.append(PATH_TO_MYAPPDIR)

from my_app.services.my_service import MyService

# If you really want to clean sys.path afterwards
sys.path = initial_sys_path

但是,也可以按照https://stackoverflow.com/a/61326547/6068769中的建议使用os.chdir

PATH_TO_MYAPPDIR = .... # same as above
os.chdir(PATH_TO_MYAPPDIR)
from my_app.services.my_service import MyService

最后,我不是VS用户,但是对于PYTHONPATH解决方案,我认为变量应该指向C:\my_app_dir

"env":{
   "PYTHONPATH":"${PYTHONPATH}C:my_app_dir"
} 

简单的问题得到简单的答案。 我在 launch.json 中错误地设置了 PYTHONPATH。 我将其更改为以下内容:

"env": {
                "PYTHONPATH": "${workspaceRoot}"
                }

如果这不是最好的方法,请纠正我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM