请考虑以下脚本:
$ 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()
功能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
找到sound.mp3
?
如果使用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]
...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句