新手遇到 import package 内其他模块的问题,查阅了各种资料都不知原因

2023-03-19 15:47:59 +08:00
 zyphaxy

使用 官方包文档中的示例

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 解决,但总感觉是什么地方有问题

1232 次点击
所在节点    Python
6 条回复
luckyx
2023-03-19 17:11:35 +08:00
`在我的 windows 上以上代码无问题`

是不是用 pycharm 跑的?

pycharm 会自动把一些地方加到 path 里面,具体比较复杂,可以阅读了解终端跑 python 的时候,path 里都有哪些具体 path

如果想部署到 linux 上,最好还是用普通的终端跑,测试一下。
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
zyphaxy
2023-03-19 21:32:47 +08:00
@luckyx windows 上使用的是 vscode,确实使用命令行执行出现 import 错误。
zyphaxy
2023-03-20 09:24:30 +08:00
还以为可以添加了__init__.py 会被自动识别为包或子包,在__path__中添加父目录。文档里也不说明一下
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` 类似的代码段。
apake
2023-03-24 16:12:37 +08:00
使用相对路径导入, 在 effects/echo.py 中 用 from .filters import karaoke
1) 第一种, import filters.karaoke 那么就要将 sound 加入到 path 中
2) 第二种, import sound.filters.karaoke, 那么就要将 sound 的父目录加入到 path 中. 或者父目录就是 当前工作目录.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/925289

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX