从python包

时间:2015-06-15 15:56:11

标签: python audio packages

我正在尝试根据用户输入的字符播放wav文件。 我的项目结构如下:

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然后将其作为模块导入控制台,则会出现IO错误。特别: IOError: [Errno 2] No such file or directory: 'sound/S.wav'

我知道我必须使用pkgutil.get_data(),但是如何在files字典中添加正确的文件路径。我的code.py应该是什么样的?

2 个答案:

答案 0 :(得分:1)

问题在于,当您运行脚本时,该脚本的当前位置是您运行它的位置,假设您使用absolute path从完全不同的位置运行脚本,然后是当前位置script是您运行脚本时所处的位置,而不是脚本的位置。

对于您的示例,在code.py中,您需要获取该python文件的位置,然后在使用之前将数据文件附加到该位置。

要获取正在运行的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'),
         ...
}

答案 1 :(得分:1)

除了data_fles中的setup.py之外,还有另一种方法:

setup.py

setup(name='dcspy',
  version=__version__,
  ...
  data_files=[('dcspy_data', ['images/dcspy.ico'])],
  ...

当您pip installdata_files放在此处时:

$ pip uninstall dcspy
Found existing installation: dcspy 1.1.2
Uninstalling dcspy-1.1.2:
 Would remove:
  d:\python38\dcspy_data\dcspy.ico
  d:\python38\lib\site-packages\dcspy-1.1.2.dist-info\*
  d:\python38\lib\site-packages\dcspy\*
  d:\python38\scripts\dcspy.exe
Proceed (y/n)? y

您可以通过以下方式在软件包中访问它们:

root = tk.Tk()
root.iconbitmap(f'{sys.prefix}/dcspy_data/dcspy.ico')

信息:2.7. Installing Additional Files