2015-06-15 3 views
1

Я пытаюсь воспроизвести wav-файл на основе символа, который вводит пользователь. Моя структура проекта выглядит следующим образом:Доступ к файлам данных из пакета python

mypkg/ 
| 
| mypkg/ 
    | 
    | __init__.py 
    | code.py 
    | sound/ 
     | 
     | A.wav 
     | B.wav 
     | ... 
| 
| setup.py 

Я добавил следующее в setup.py:

package_dir={'mypkg': 'mypkg'}, 
package_data={'mypkg': ['sound/*.wav']} 

Мои code.py выглядит следующим образом:

files = { 
     'A': 'sound/A.wav', 
     'B': 'sound/B.wav', 
     ... 
} 
c = raw_input() 
f = files.get(c, '?') 
...playing the wave file code... 

Я знаю 'A': 'sound/A.wav', неправильно. Проблема в том, что все работает нормально, если я использую код как скрипт, но я получаю ошибку ввода-вывода, если я запускаю setup.py, а затем импортирую это как модуль в консоли. В частности: IOError: [Errno 2] No such file or directory: 'sound/S.wav'

Я знаю, что я должен использовать pkgutil.get_data() но тогда как я могу добавить правильный путь к файлам в моем files словаре. Каким должен быть мой code.py?

ответ

1

Проблема заключается в том, что при запуске сценария текущее местоположение этого сценария - это то место, где вы его запускаете, предположим, что вы запускаете сценарий из совершенно другого местоположения с использованием absolute path, тогда текущее местоположение внутри этого скрипта является где вы были, когда вы запускали скрипт, а не местоположение сценария.

Для вашего примера, в вашем code.py, вам необходимо получить местоположение этого файла python, а затем добавить файл данных в это место, прежде чем использовать его.

Чтобы получить расположение питона файла запущенной, вы можете использовать __file__, или лучше - os.path.realpath(__file__), вы должны понимать, что __file__ бы дать полный путь к файлу, чтобы извлечь папку, вы должны использовать - os.path.dirname().

Тогда ваш код будет выглядеть -

pt = os.path.dirname(os.path.realpath(__file__)) 
files = { 
     'A': os.path.join(pt, 'sound/A.wav'), 
     'B': os.path.join(pt, 'sound/B.wav'), 
     ... 
} 
+0

Получение ошибки: 'IOError: [Errno 2] Нет такого файла или каталога:«C: \\ python27 \\ Lib \\ сайт-пакеты \ \ morse_talk-0.1.1-py2.7.egg \\ morse_talk \\ enunciate.pyc \\ sound \\ A.wav'' Как устранить enunciate.pyc? – Araf

+0

Исправлено, пожалуйста, проверьте сейчас. –

+0

Также было бы очень признательно, если бы вы согласились с ответом, если бы они помогли вам, поскольку это побудило бы сообщество мотивировать своевременно давать хорошие ответы. (Не только этот, по любому из ваших вопросов) –