我怎样才能确保python找到必要的数据文件?

时间:2015-12-25 14:20:52

标签: python setuptools distutils python-module setup.py

请考虑这个脚本:

$ tree my_application 
my_application
├── my_application
│   ├── sound.mp3
│   ├── __init__.py
│   ├── my_application.py
│   ├── my_application.pyc
│   └── __pycache__
│       ├── __init__.cpython-34.pyc
│       └── my_application.cpython-34.pyc
├── my_application.egg-info
│   ├── dependency_links.txt
│   ├── entry_points.txt
│   ├── PKG-INFO
│   ├── requires.txt
│   ├── SOURCES.txt
│   └── top_level.txt
├── run.py
├── MANIFEST.in
└── setup.py

my_application.py是一个只使用sound.mp3播放mplayer的脚本:

class Sound():
    def __init__(self):
        self.cmd = ["mplayer", "sound.mp3"]            
    def play(self):
        subprocess.Popen(self.cmd)

setup.py是您的经典setup.py文件,console_scriptmy_application:main

MANIFEST.in包含对sound.mp3的引用,以确保在运行setup.py时复制它:

include my_application/sound.mp3
global-exclude *.pyc

run.py包含一小段代码来运行main()的{​​{1}}函数:

my_application

还有一个from my_application import main if __name__ == "__main__": main() 文件,以便__init__.py功能正确地显示在'外部世界':

main()

现在,当我在内部from .my_application import main __all__ = ["main"] 目录中运行main()函数时,此脚本可以正常工作。但是一旦该功能从其他地方运行,例如通过运行my_application或使用控制台脚本,run.py会抱怨它无法找到mplayer

sound.mp3

我如何确保Cannot open file 'sound.mp3': No such file or directory 找到mplayer,无论我在哪个目录?

1 个答案:

答案 0 :(得分:1)

如果您使用的是setuptools,则可以使用pkg_resources检索文件的正确路径:

import pkg_resources

class Sound():
    def __init__(self):
        sound_path = pkg_resources.resource_filename(
            'my_application', 'sound.mp3')
        self.cmd = ['mplayer', sound_path]

    ...