我有一个python项目,我不能从命令行对子目录中的类运行测试。它可以在Pycharm中工作,但不能在命令行中工作。我把它简化如下:
/utils
__init__.py
util.py
/tests
test.py
util.py如下:
class UtilClass:
def __init__(self):
print(" in __init__ ")
,utils/__init__.py
为
from .util import (
UtilClass
)
test。py试着调用它:
from utils import UtilClass
x = UtilClass()
当我运行(从顶级目录):% python tests/test.py
是说ModuleNotFoundError: No module named 'utils'
。我是否需要对包含utils的路径做些什么?还是顶层的init。py ?
问题是当您执行% python tests/test.py
时,python不包括路径中的当前目录。如果您在test.py的开头添加'import sys;print(sys.path)',您将看到'tests/'目录是路径的一部分,但是您运行命令的顶层目录不在那里。几个解决方案:
选项1:显式添加当前目录(临时)
做PYTHONPATH='.' python tests/test.py
。如果您这样做,顶级目录将在路径中,因此test.py将找到utils/并可以找到UtilClass。这纯粹是临时的,所以很适合运行测试。
您也可以使用export PYTHONPATH='/path/to/top/level'
,它将在该命令行的生命周期内保留。
选项2:安装当前目录(last)
从顶级目录执行pip install -e .
。这将把目录安装为'——editable',用于开发模块,这意味着它创建了一个到您的开发区域的链接。因为它现在已经安装了,python会找到它。它会一直存在,直到你卸载它。