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
Tianny
V2EX  ›  Python

求助!关于 pycharm 导入自定义模块的问题!

  •  
  •   Tianny · 2017-03-13 17:34:28 +08:00 · 8900 次点击
    这是一个创建于 2818 天前的主题,其中的信息可能已经有所发展或是发生改变。

    http://p1.bqimg.com/1949/d47e9f7237c99ae4.png

    http://p1.bqimg.com/1949/e97af30172ba6985.png

    用的python版本是3.5.2

    第一章图是我导入模块时报的错。简要说明下: 用 from apis import APIError pycharm 直接提示模块找不到,于是用 from .apis import APIError pycharm 虽然没有提示有问题,但是运行是报 SystemError: Parent module '' not loaded, cannot perform relative import 。图中我都用箭头标出来了。

    第二张图是 pycharm 的默认配置。

    我用 from .apis import APIError 意思不就是导入当前路径下的模块么,为什么运行时报错呢?这个问题怎么解决呢,各位帮忙下!感谢!

    17 条回复    2018-04-03 02:19:54 +08:00
    Tianny
        1
    Tianny  
    OP
       2017-03-13 17:46:49 +08:00
    pycharm 版本是 2016.2.3
    mgna17
        2
    mgna17  
       2017-03-13 17:53:31 +08:00
    alphadog619
        3
    alphadog619  
       2017-03-13 17:55:59 +08:00
    自定义模块要放在一个 package 中,也就是文件夹中必须有一个__init__.py 才能作为自定义包来引用
    lgpqdwjh
        4
    lgpqdwjh  
       2017-03-13 18:01:32 +08:00
    要理解什么是包, 何为 __init__.py
    Tianny
        5
    Tianny  
    OP
       2017-03-13 18:09:25 +08:00
    @mgna17 http://p1.bpimg.com/1949/dccbaca1022f7cc1.png 为什么我改成这样就可以了?并没有加__init__.py ,用 from apis import APIError ,虽然 pycharm 提示找不到模块,但是代码却正确执行了?我现在的所有代码都是在 www 同一个目录下的
    Tianny
        6
    Tianny  
    OP
       2017-03-13 18:10:32 +08:00
    @lgpqdwjh http://p1.bpimg.com/1949/dccbaca1022f7cc1.png 为什么我改成这样就可以了?并没有加__init__.py ,用 from apis import APIError ,虽然 pycharm 提示找不到模块,但是代码却正确执行了?我现在的所有代码都是在 www 同一个目录下的
    mgna17
        7
    mgna17  
       2017-03-13 18:11:20 +08:00
    @mgna17 看错了,尴尬,无视我#2 那句
    amoyiki
        8
    amoyiki  
       2017-03-13 18:13:42 +08:00 via iPhone   ❤️ 1
    因为 IDE 的搜索路径应该是以 mblog 为根目录的。所以提示找不到模块,其实我平常都是忽略这些检查的
    Tianny
        9
    Tianny  
    OP
       2017-03-13 18:13:53 +08:00
    @alphadog619 http://p1.bpimg.com/1949/dccbaca1022f7cc1.png 为什么我改成这样就可以了?并没有加__init__.py ,用 from apis import APIError ,虽然 pycharm 提示找不到模块,但是代码却正确执行了?我现在的所有代码都是在 www 同一个目录下的
    Tianny
        10
    Tianny  
    OP
       2017-03-13 18:23:07 +08:00
    @amoyiki 懂了!所以可以在 www 目录下建个__init__.py 这样导入 from www.apis imprt APIError.那么导入同一个目录下的文件,不需要__init__.py ,因为并没有跨 package 导入。是吗?
    amoyiki
        11
    amoyiki  
       2017-03-13 18:27:03 +08:00 via iPhone
    我记得 pycharm 可以自定义项目根目录的功能,你可以查查看
    sunbeams001
        12
    sunbeams001  
       2017-03-13 19:43:33 +08:00
    是这个吧
    www - right click - Mark Directory As - Sources Root
    wuyadong
        13
    wuyadong  
       2017-03-13 20:33:52 +08:00
    mark directory as source root ?
    Tianny
        14
    Tianny  
    OP
       2017-03-13 21:38:32 +08:00
    @sunbeams001 恩恩
    piapia
        15
    piapia  
       2017-03-16 22:54:21 +08:00
    from .apis import APIError 是相对引用, 把点去掉就可以了.
    chunjie
        16
    chunjie  
       2018-04-03 01:49:28 +08:00
    @piapia 把点去掉是可以,但是 pycharm 又提示出错,可以我导入那些别人写好的包像 from redis import StrictRedis,pycharm 不会报错也能运行,为何导入自己相对路径下的 pycharm 就提示出错呢?
    chunjie
        17
    chunjie  
       2018-04-03 02:19:54 +08:00
    @chunjie 我明白了,原来是要 pycharm 可以对某个文件夹设置为 root,就不会报错了,如果是要引用 root 下的子文件夹下的文件,那么就要在这个子文件夹下添加__init__.py 文件才能执行,不能添加__init__.py 文件 pycharm 不会报错,但是无法执行,会提示找不到模块。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5340 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:37 · PVG 17:37 · LAX 01:37 · JFK 04:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.