在Python中,如何获取模块内文件目录的路径

时间:2019-05-13 21:36:50

标签: python python-3.x

我创建了一个名为“播放器”的模块,该模块具有wav文件的子目录:

user/repositories/python_packages/playr/
|
|--__init__.py
|--sounds/
|   |--sound1.wav
|   |--sound2.wav
|   |--sound3.wav

我的__init__.py中的一个函数应获取sounds/目录中所有文件的列表,以便播放选定的声音:

from os import listdir
import os.path
import subprocess

def play(sound=0):
    wav_files = listdir('sounds')
    sound_file = os.path.join('sounds', wav_files[sound])
    return_code = subprocess.call(['afplay', sound_file])

因为我想共享此模块,所以我需要找到一种方法来获取到sounds/目录的路径而无需对绝对路径进行硬编码。父目录user/repositories/python_packages/包含在我的PYTHONPATH变量中。

当前,当我尝试从其他目录中的python env使用模块时,它是这样的:

from playr import play

play()


----------------------------------------------------------------
FileNotFoundError: [Errno 2] No such file or directory: 'sounds'

我知道它找不到sounds/目录,因为它是在我当前的环境中而不是在模块中。 我的问题是如何让我的功能在模块中而不是当前环境中查看

到目前为止,我已经使用os.pathpathlib尝试了许多不同的方法。我还尝试了使用module.__file__

的不同方式

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

os.path.abspath(__file__)返回当前模块文件的完整路径名,即/foo/bar/baz/module.py之类的文件。

os.path.dirname(fullpath)删除文件名,仅返回目录,即/foo/bar/baz

所以,您想要:

os.path.join(os.path.dirname(os.path.abspath(__file__)), 'sounds')

答案 1 :(得分:0)

python 3.7+中的解决方案是importlib.resources,或者<3.7的backport importlib_resources

# py 3.7

import os, subprocess
from importlib.resources import path

def play(sound=0):
    with path('playr', 'sounds') as p:
        sounds_path = p
    sounds = os.listdir(sounds_path)
    audio_file = os.path.join(sounds_path, sounds[sound])
    return_code = subprocess.call(['afplay', audio_file])
相关问题