如何在python中指定根模块目录?

时间:2015-03-19 03:00:44

标签: python unit-testing pandas travis-ci

我有使用pandas在python中恢复一些小excel文件的代码,并对它们执行一些数据分析。我现在正试图设置我的代码测试,但我遇到了一些麻烦,我在搜索时找不到合适的答案。

这是我的代码的目录结构:

my_project/
    __init__.py
    code/
        __init__.py
        analysiscode.py
    tests/
        __init__.py
        testcode.py
    data/
        datafile.xlsx

我最初是从analysiscode.py目录运行code,所以我通过指定路径来恢复数据文件:

import pandas as pd
df = pd.read_excel('../data/datafile.xlsx')

但是,现在当我尝试对模块根目录(即my_project)中的代码运行测试时,指定在查找数据目录之前上一个目录的路径不再有效。

以下是错误消息的示例:

my_project$ nosetests
IOError: [Errno 2] No such file or directory: '../data/datafile.xlsx'

对于这种特殊情况,我总是可以指定完整路径,但我正在寻找更通用的解决方案,以便其他人可以下载此代码并仍然可以使用它。

有没有办法在python中指定my_project目录?换句话说,有没有办法按照

的方式说些什么
mydatadir = my_project/data
df = pd.read_excel(mydatadir+'datafile.xlsx')

这样我可以从my_project/code目录或my_project目录运行分析代码,而无需知道my_project的完整路径?

2 个答案:

答案 0 :(得分:1)

导入__file__后,我使用my_project找出了模块根路径:

In [1]: import my_project
In [2]: print(my_project.__file__)
Out[2]: /Users/me/projects/my_project.__init__.py

通过一些字符串操作摆脱.__init__.py到达模块根目录:

In [3]: my_project_dir = '/'.join(str(my_project.__file__).split('/')[:-1])
In [4]: print(my_project_dir)
Out[4]: '/Users/me/projects/my_project/'

将此应用到我上面的代码示例中,无论当前工作目录是什么,都可以恢复数据:

import my_project
import pandas as pd
my_project_dir = '/'.join(str(my_project.__file__).split('/')[:-1])
df = pd.read_excel(my_project_dir+'data/datafile.xlsx')

我已经对此进行了测试,现在我可以在analysiscode.py目录内以及code目录中成功运行my_project,并运行{{1}来自nosetests目录也可以。

答案 1 :(得分:0)

只要您在my_project或其任何子目录中,就可以进入基本目录(my_project)。在此代码之后,您可以运行诸如
df = pd.read_excel('data/datafile.xlsx')

之类的命令
import os
my_dir = "my_project" #Root Directory
while os.getcwd().find(my_dir) >= 0:
    os.getcwd("..") #Go back until you are out of the my_dir
os.chdir(my_dir) #Go back into my_dir
相关问题