2015-12-25 2 views
1

Пожалуйста, обратите внимание этот скрипт:Как я могу убедиться, что python находит необходимые файлы данных?

$ 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, независимо от каталога я в?

+0

Вы можете показать кусок кода, который нагружает 'sound.mp3' файл? –

+0

Вы использовали относительный путь к 'sound.mp3', который действителен из скрипта, который находится в другом каталоге? Ошибка, которую вы описываете, звучит так же, как [эта проблема] (https://stackoverflow.com/questions/28346800/python-file-does-not-exist-error/28346955#28346955) здесь. –

+0

@ DanielePantaleone: Конечно. Обновлено. OliverW: см. Обновление. Думаю, что да. –

ответ

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] 

    ... 
+0

Спасибо, что сработало –

Смежные вопросы