新手遇到 import package 内其他模块的问题,查阅了各种资料都不知原因 - V2EX
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 1706 次点击
    这是一个创建于 938 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 官方包文档中的示例

    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     Solana     910 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 22:36 PVG 06:36 LAX 15:36 JFK 18:36
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86