请考虑这个脚本:
$ 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_script
到my_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
,无论我在哪个目录?
答案 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]
...