2011-07-08 192 views
4

我有以下目录结构的Python项目:访问资源文件

 
project/ 
project/src/ 
project/src/somecode.py 
project/src/mypackage/mymodule.py 
project/src/resources/ 
project/src/resources/datafile1.txt 

在mymodule.py,我有一个类(可以称之为“MyClass的”),这需要加载datafile1.txt。这种类型的作品,当我做:

开放(“../resources/datafile1.txt”)

假设创建创建的MyClass的实例从somecode.py运行代码。

但是,我有单元测试mymodule.py在该文件中定义,如果我离开相对路径名如上所述,单元测试代码爆炸,因为代码正在从项目/ src/mypackage而不是project/src,并且相关文件路径无法正确解析。

任何有关解决此问题的最佳实践类型方法的建议?如果我将测试用例移动到项目/ src中,使用测试用例混淆主源文件夹。

回答

0

在包含Python脚本的每个目录中,放置一个知道层次结构根目录路径的Python模块。它可以用相对路径定义一个单一的全局变量。在每个脚本中导入此模块。 Python首先搜索当前目录,以便始终使用当前目录中的模块版本,该目录将具有当前目录根目录的相对路径。然后用这个来找到你的其他文件。例如:

# rootpath.py 
rootpath = "../../../" 

# in your scripts 
from rootpath import rootpath 
datapath = os.path.join(rootpath, "src/resources/datafile1.txt") 

如果你不想把额外的模块在每个目录,你可以使用这种方法:

把一个哨兵文件在目录结构中,例如顶层thisisthetop.txt。让Python脚本在目录层次结构中向上移动,直到找到此文件。写下所有相对于该目录的路径名。

您可能已经将项目目录中已有的某些文件用于此目的(例如继续向上移动,直至找到src目录),或者您可以用明显的方式命名项目目录。

+0

艾奇,但工程。谢谢。 –

0

文件路径将相对于您最初调用的脚本。我建议你将相对路径作为参数传递给MyClass。这样,根据哪个脚本正在调用MyClass,您可以拥有不同的路径。

+0

这不是真的,文件路径相对于调用脚本时的工作目录。 –

5

我通常使用它从我的模块中获取相对路径。从来没有尝试过单元测试。

import os 

print(os.path.join(os.path.dirname(__file__), 
        '..', 
        'resources' 
        'datafile1.txt')) 

注意:..技巧工作得很好,但如果您更改目录结构,则需要更新该部分。