我有一个Python项目结构如下。
.├── data├── src│ ├── module1│ └── module2└── tests ├── base ├── module1 └── module2
该 data
目录是我放置用于单元测试的模拟数据的地方(例如CSV文件)。如果我在PyCharm里面,在单元测试里面,我可以使用下面的相对路径,并使用IDE来运行单元测试(使用 unittests
)成功。
pd.read_csv('../../data/mock.csv')
然而,在PyCharm之外,我可以尝试运行以下命令来运行单元测试。
python -m unittest tests/module1/*.py
我将得到一个错误,说文件不存在。如果我改变路径如下,那么从PyCharm外部运行单元测试就会成功,但在PyCharm内运行测试就会失败。
pd.read_csv('./data/mock.csv')
当我检查单元测试配置时,我注意到 working directory
设置为 /Users/myusername/myproject/tests/module1
. 如果我把工作目录改为 /Users/myusername/myproject
我得到以下错误信息。AssertionError: Path must be within the project
.
我甚至尝试移动 data
目录进入 tests > module1
但同样的冲突依然存在;现在 pd.read_csv('./data/mock.csv')
对PyCharm有效,但对终端失败。
有什么办法可以解决这个冲突吗?
我解决了这个问题,抽象出了获取mock数据的路径。
def normalize_path(resource, proj_root='root_folder'):
path = os.getcwd() # current working directory
tokens = path.split('/') # tokens of directory path
index = tokens.index(proj_root) # look for where project root ends
tokens = tokens[1:index + 1] # reconstruct the path up to the project root
p = '/'.join(tokens)
p = f'/{p}/{resource}' # append the resource to the project root
return p
在我的代码中,现在我做了如下的事情。
pd.read_csv(normalize_path('data/mock.csv'))
我可以在终端或PyCharm中顺利执行测试。