我有以下项目结构
SampleProject
com
python
example
source
utils
ConfigManager.py
conf
constants.cfg
如何从ConfigManager.py访问constants.cfg。
我有一个限制
我不能给出constants.cfg的完整路径(绝对路径),因为如果我在不同的PC上运行,它应该可以与任何modification
文件名= ..\..\..\..\..\..\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'))
发布于 2013-06-22 12:06:50
如果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.py
和constants.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")
发布于 2013-06-22 05:37:29
如果你在项目树的根目录中有一些模块,假设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或任何其他需要配置的模块中:
import config_loader
file_path = config_loader.get_config_path()
config_file = open(file_path)
你甚至可以让你的config_loader.py只返回配置文件。
发布于 2019-06-27 08:55:42
可以在 3.0+中使用pathlib包
这将获取跨不同平台的SampleProject文件夹中包含的任何文件的路径。
from pathlib import Path
def get_file(path):
"""
returns the absolute path of a file
:var
str path
the file path within the working dir
:returns
PureWindowsPath or PurePosixPath object
type depends on the operating system in use
"""
def get_project_root() -> Path:
"""Returns project root folder."""
return Path(__file__).parent.parent
return get_project_root().joinpath(path)
然后,只需使用file_path作为参数调用该函数:
filePath = get_file('com/python/example/source/utils/configManager.py')
然后是通常的步骤:
while open(filePath) as f:
<DO YOUR THING>
https://stackoverflow.com/questions/17244406
复制相似问题