V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zyphaxy
V2EX  ›  Python

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

  •  
  •   zyphaxy · 2023-03-19 15:47:59 +08:00 · 1391 次点击
    这是一个创建于 615 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 官方包文档中的示例

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

    6 条回复    2023-03-24 16:12:37 +08:00
    luckyx
        1
    luckyx  
       2023-03-19 17:11:35 +08:00
    `在我的 windows 上以上代码无问题`

    是不是用 pycharm 跑的?

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

    如果想部署到 linux 上,最好还是用普通的终端跑,测试一下。
    noparking188
        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
    zyphaxy
        3
    zyphaxy  
    OP
       2023-03-19 21:32:47 +08:00
    @luckyx windows 上使用的是 vscode,确实使用命令行执行出现 import 错误。
    zyphaxy
        4
    zyphaxy  
    OP
       2023-03-20 09:24:30 +08:00
    还以为可以添加了__init__.py 会被自动识别为包或子包,在__path__中添加父目录。文档里也不说明一下
    fbichijing
        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` 类似的代码段。
    apake
        6
    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 中. 或者父目录就是 当前工作目录.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1739 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:40 · PVG 00:40 · LAX 08:40 · JFK 11:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.