我创建了一个名为“播放器”的模块,该模块具有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.path
和pathlib
尝试了许多不同的方法。我还尝试了使用module.__file__
任何帮助将不胜感激!
答案 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])