2013-06-21 27 views
3

访问文件我有以下项目结构的Python:如何从不同的目录

SampleProject 
    com 
     python 
      example 
      source 
       utils 
        ConfigManager.py 
    conf 
     constants.cfg 

如何从ConfigManager.py访问constants.cfg。

我有一个限制

  1. 我不能给constants.cfg的完整路径(绝对路径),因为如果我在不同的PC上运行它应该制定出任何修改
  2. 另外,如果我代表像下面的东西,我可以访问该文件。但我不希望每次

    filename = ..\\..\\..\\..\\..\\..\\constants.cfg` 
    

目前,我做这样的事情给回斜线。但是,这只有当constants.cfg和ConfigManager.py都在同一个目录

currentDir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 
file = open(os.path.join(currentDir,'constants.cfg'))  
+1

我不知道是否有办法解决,但得到当前目录,可以使用os.getcwd()。 – travis1097

+0

SamplePoject是否包含\ __ init__.py文件? constants.cfg是否采用特定格式,或者它也可以是Python文件? – Inkane

回答

4

如果conf是一个Python包,那么你可以使用pkgutil.get_data()

import pkgutil 

data = pkgutil.get_data("conf", "constants.cfg") 

或者,如果setuptools安装 - pkg_resources.resource_string()

import pkg_resources 

data = pkg_resources.resource_string('conf', 'constants.cfg') 

如果constants.cfg不是在一个包,然后通过其路径作为命令行参数,或将其设置为环境变量,例如,CONFIG_MANAGER_CONSTANTS_PATH,或者从固定的一组默认路径读取,例如os.path.expanduser("~/.config/ConfigManager/constants.cfg")。要找到放置用户数据的地方,您可以使用appdirs module

如果您可以从不同目录运行ConfigManager.py,则不能使用返回当前工作目录的os.getcwd()。相对路径"../../..."不会出于同样的原因。

如果您确信的ConfigManager.pyconstants.cfg在文件系统中的相对位置不会改变:

import inspect 
import os 
import sys 

def get_my_path(): 
    try: 
     filename = __file__ # where we were when the module was loaded 
    except NameError: # fallback 
     filename = inspect.getsourcefile(get_my_path) 
    return os.path.realpath(filename) 

# path to ConfigManager.py 
cm_path = get_my_path() 
# go 6 directory levels up 
sp_path = reduce(lambda x, f: f(x), [os.path.dirname]*6, cm_path) 
constants_path = os.path.join(sp_path, "conf", "constants.cfg") 
+0

非常感谢你.... – Venkatesh

1

如果你有在项目树根一些模块,说config_loader.py看起来像这样:

import os 

def get_config_path(): 
    relative_path = 'conf/constants.cfg' 
    current_dir = os.getcwd() 
    return os.join(current_dir, relative_path) 

然后在ConfigManager.py或需要CONFIGS任何其他模块:

import config_loader 

file_path = config_loader.get_config_path() 
config_file = open(file_path) 

你甚至可以有你的config_loader.py刚刚回归的配置文件。

+0

只有在您从SampleProject目录运行ConfigManager.py时,'getcwd()'才有效。 – jfs

相关问题