一种可重用的方法来获取Python中当前用户定义包的目录?

时间:2018-10-14 01:03:09

标签: python

对于以下目录结构,我想通过my_package/logs将日志写入log_manager.py文件夹。

my_package/
    my_package/
        __init__.py
        main.py
        log_manager.py
        logs/
    setup.py

我想确保从系统中任何目录执行入口点都可以将日志一致地写入my_package/logs。 一种方法是采用目录结构并获取log_manager.py的父目录来推断logs/

package_dir = os.path.abspath(os.path.join(__file__, '..')))
log_dir = os.path.join(package_dir, 'logs')

但是,如果将来我想添加另一个目录plots(如下所示),则需要使用类似的方法再次重复我的软件包目录,这是重复的。

my_package/
    my_package/
        __init__.py
        main.py
        log_manager.py
        logs/
        plots/
    setup.py

因此,我想找到可重用的方法来定位软件包目录。为此,我可以在log_manager.py中定义一个函数,但是不确定这是否是最好的方法吗?该功能似乎是一个非常常见的功能,我期待有更简单的方法。

def get_package_dir():
    package_dir = os.path.abspath(os.path.join(__file__, '..')))
    return package_dir

2 个答案:

答案 0 :(得分:1)

setuptools的pkg_resources模块提供了帮助程序方法来定位模块的绝对路径。

from pkg_resources import resource_filename as resource

package_dir = resource('my-package', 'log_manager.py')
log_dir = os.path.join(package_dir, 'logs')

尽管如此,我认为在模块目录中写入日志也不是一个好习惯。

答案 1 :(得分:0)

我不确定您要查找的内容,但是您是否不能仅将方法写入log_manager.py并将其写入logs /并从项目的任何位置导入log_manager?您可以使用单独的plot_manager.py将地块转储到plots /中。