2013-06-21 49 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

相關問題