使用 官方包文档中的示例
sound/ Top-level package
__init__.py Initialize the sound package
formats/ Subpackage for file format conversions
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py
...
filters/ Subpackage for filters
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
按理说不应该有问题,在 effects/echo.py 中
import filters.karaoke
报错"ModuleNotFonundError: No Module named filters"
import sound.filters.karaoke
也报错"ModuleNotFonundError: No Module named sound"
在我的 windows 上以上代码无问题,在我的 ubuntu 上就会报错,这是为啥
可以通过 sys.path.append 解决,但总感觉是什么地方有问题
1
luckyx 2023-03-19 17:11:35 +08:00
`在我的 windows 上以上代码无问题`
是不是用 pycharm 跑的? pycharm 会自动把一些地方加到 path 里面,具体比较复杂,可以阅读了解终端跑 python 的时候,path 里都有哪些具体 path 如果想部署到 linux 上,最好还是用普通的终端跑,测试一下。 |
2
noparking188 2023-03-19 18:24:40 +08:00
可以提供下更详细的信息
如果你是直接执行 effects/echo.py 遇到 ModuleNotFonundError ,那是因为如楼上所说,path 里没有载入这个 module 如果你是想把 sound 打包使用,可以配置下 setup ,每次更新安装就能加载好 sound 的 module 到 path ,代码里可以随意引用 这是我打包库的 setup 示例,仅供参考: https://github.com/zhiweio/StreamXfer/blob/master/setup.py |
4
zyphaxy OP 还以为可以添加了__init__.py 会被自动识别为包或子包,在__path__中添加父目录。文档里也不说明一下
|
5
fbichijing 2023-03-20 09:30:48 +08:00
在使用 Python 编写 Package 的时候,如果在文件夹下放置 __init__.py 文件,就表明这个是一个 package 。
个人理解,在这种情况下,整个模块是一个整体,一般测试运行和使用都是通过 `import sound` 或者 `from sound import *` 这种方式。测试的时候要切换到 sound 路径下或者将 sound 所在路径添加仅 path 。最终这个 sound package 多半会添加 setup.py 可以直接通过 `pip install sound` 这种方式来直接安装,也可以上传到 pypi 。平时使用 python `pip install [package]` 的 package 就是这么来的。另外也可以通过 setup.py 添加全局命令供命令行使用,十分方便! 对于每一个 package 里面的 import ,通过相对路径的导入会比绝对路径具有大一点的灵活性。对于这部分,你可以去看 《 Python Cookbook 3 》那本书,里面有更加详细的描述。我记得有 stackoverflow 里面有一个页面讨论了相对路径导入和绝对路径导入的问题的。 总体来说,将代码写成 package 这种形式(带 __init__.py) 的,package 的使用是以整体来看的,单独每个 py 的代码都可能无法直接运行。所以有些 package 里面都有一个 tests 的文件夹,里面的测试代码一般都带有 `sys.path.append` 类似的代码段。 |